2013-05-28 23 views
1

我正在寻求一些帮助,我的左加入限制。如何获得左加入限制

我想要做的是循环通过我的用户,并检查另一个表,如果有问题连接到用户。

,但目前我得到的各种怪异的结果,并没有限制结果为每一个用户,它也列出列status_link_missing = 0,即使我已经告诉子查询只列出status_link_missing = 1

因此,我现在卡住了,非常感谢帮助!

SELECT 
     a.user_id AS settings_userid 
    , a.contact_interval 
    , b.user_id 
    , b.notify_user 
    , b.status_host_down 
    , b.status_link_missing 
    , b.status_relnofollow 
FROM `link_exchange_settings` a 
LEFT JOIN link_exchange_links b 
    ON b.id 
    = (SELECT c.id 
     FROM link_exchange_links AS c 
     WHERE 
     b.user_id = a.user_id 
     AND c.notify_user = 1 
     AND c.status_link_missing = 1 
     LIMIT 1 
     ) 
WHERE a.allow_contact = 1 
LIMIT 10 

编辑

我切换SELECT b.id现在c.id和LIMIT的作品,但现在它仅适用于第一个用户

enter image description here

回答

2

尝试这种变化(在子查询b没有参考):

SELECT 
     a.user_id AS settings_userid 
    , a.contact_interval 
    , b.user_id 
    , b.notify_user 
    , b.status_host_down 
    , b.status_link_missing 
    , b.status_relnofollow 
FROM `link_exchange_settings` a 
LEFT JOIN link_exchange_links b 
    ON b.id 
    = (SELECT c.id      -- changed 
     FROM link_exchange_links AS c 
     WHERE 
     c.user_id = a.user_id    -- changed 
     AND c.notify_user = 1 
     AND c.status_link_missing = 1 
     -- ORDER BY c.something   -- optional, recommended addition 
     LIMIT 1 
     ) 
WHERE a.allow_contact = 1 
-- ORDER BY a.something_else    -- optional, recommended addition 
LIMIT 10 ; 

这也是件好事,ORDER BY当您使用LIMIT。除非你想要不确定的结果。

+0

感谢@ypercube这个伎俩!你从完全失败中拯救了我的大脑,非常感谢! – John

+0

好听。这看起来像写一个“每​​组最大”查询的奇怪方法,但我经常在MySQL中使用它(对于正确的索引它通常是有效的)。 –

1

你是在子查询中使用“c.status_link_missing = 1”,但如果您将在WHERE子句中使用“AND”,您将获得所需的结果。

事实上,您必须在主查询的WHERE子句中决定并使用适当的条件,而不是使用LEFT JOIN子查询。

+0

我不确定我是否遵循Fahad,是否需要在子查询外包含link_exchange_links? – John

+0

对不起,我还是不跟进,感觉有点哑这里 – John

+1

请更正查询为: '选择 a.user_id AS settings_userid ,a.contact_interval ,b.user_id ,b.notify_user ,b.status_host_down ,b.status_link_missing ,b.status_relnofollow FROM link_exchange_settings一个 LEFT JOIN link_exchange_links b ON ( b.user_id = a.user_id AND b.notify_user = 1 AND b.status_link_missing = 1 ) WHERE a.allow_contact = 1 LIMIT 10' –