我正在向我的左连接寻求一些限制。
我要做的是循环访问我的用户并检查另一个表是否存在与用户相关的问题。
但是目前我得到了各种奇怪的结果,并没有限制每个用户的结果,它也列出了列 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 now 并且LIMIT有效,但现在它只适用于第一个用户
答案 0 :(得分: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
也很不错。除非你想要不确定的结果。
答案 1 :(得分:1)
您在子查询中使用“c.status_link_missing = 1”,但如果您将在WHERE子句中使用“AND”,您将获得所需的结果。
实际上你必须在主查询的WHERE子句中决定并使用适当的条件,而不是LEFT JOIN子查询。