我有一个查询的下一个结果。我做了这个:

在ID 6的用户“阿德里亚娜·史密斯”被重复的地方,因为她有不同的合同日期,为此,我从表bo_users到bo_users_contracts (1: Many to bo_users_contracts)做了一个左联接。查询如下:
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')但是我想得到所有的用户,但是从用户阿德里亚纳,我只想得到“当前”列= 1的出现。
因此,最终结果将是3个用户的记录: Alejandro、Rhonda和Adriana (“当前”= 1)。
谢谢!
发布于 2017-10-27 16:26:22
由于您希望限制表的外部连接,所以应该将限制放在联接本身上,以便保留来自bo_users的所有记录。(如外部联接所示)
从本质上说,限制是在连接之前应用的,因此保留了从BO_users到bo_users_contracts的不匹配记录。如果在where子句中的联接之后应用,则没有匹配记录的BO_user记录将具有当前的空值,因此在应用current=1筛选器时将被排除在外。
在本例中,应该在where中的唯一值将来自表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子句限制移动到联接。我指出这一点,因为您的查询在它的定义中是“不一致的”,在以后维护时会导致歧义。
https://stackoverflow.com/questions/46979396
复制相似问题