我有查询的下一个结果。我这样做了:
用户" Adriana Smith"因为她有不同的合同日期而重复ID为6,为此我从表bo_users到bo_users_contracts(1:m一对多关系)进行了左连接。查询如下:
SELECT bo_users.ID, bo_users.display_name, COALESCE (bo_users_contracts.contract_start_date,'-') AS contract_start_date, COALESCE (bo_users_contracts.contract_end_date, '-') AS contract_end_date, COALESCE (bo_users_contracts.current,'-') AS current
FROM bo_users
LEFT JOIN bo_users_contracts ON bo_users.ID = bo_users_contracts.bo_users_id
LEFT JOIN bo_usermeta ON bo_users.ID = bo_usermeta.user_id
WHERE (bo_usermeta.meta_key = 'role' AND bo_usermeta.meta_value = 'member')
但是我希望得到所有用户,但是来自用户Adriana我只是想知道"当前" column = 1。
所以最终结果将是3个用户的记录: 亚历杭德罗,朗达和阿德里安娜("当前" = 1)
谢谢!
答案 0 :(得分:0)
由于您要限制外连接的表,因此应将限制放在连接本身上,以便保留bo_users中的所有记录。 (如外连接所示)
本质上,限制是在连接之前应用的,因此保留了从BO_users到bo_users_contracts的不匹配记录。如果在where子句中的join之后应用,则BO_user中没有匹配记录的记录将具有当前的null值,因此在应用current = 1过滤器时将被排除。
在这个例子中,应该在哪里的唯一值来自表BO_USERS。
我甚至将bo_usermeta过滤器移动到联接,否则你可能会失去bo_users;或者第三个表上的左连接应该是内连接。
SELECT bo_users.ID
, bo_users.display_name
, COALESCE (bo_users_contracts.contract_start_date,'-') AS contract_start_date
, COALESCE (bo_users_contracts.contract_end_date, '-') AS contract_end_date
, COALESCE (bo_users_contracts.current,'-') AS current
FROM bo_users
LEFT JOIN bo_users_contracts
ON bo_users.ID = bo_users_contracts.bo_users_id
and bo_users_contracts.current = 1
LEFT JOIN bo_usermeta --This is suspect
ON bo_users.ID = bo_usermeta.user_id
WHERE (bo_usermeta.meta_key = 'role' --this is suspect
AND bo_usermeta.meta_value = 'member') --this is suspect
读取此内容的行是可疑的,因为您有一个左连接,这意味着您希望所有用户都来自bo_users。但是,如果用户没有定义meta_key或meta_value,它们将被删除。将连接更改为内连接或将where子句限制移动到连接。我指出这一点,因为您的查询是"不一致"在其定义中导致后来维持时的模糊性。