MySQL - 如何在SQL中给出条件的重复记录之一?

时间:2017-10-27 16:13:59

标签: mysql

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

用户" 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)

谢谢!

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子句限制移动到连接。我指出这一点,因为您的查询是"不一致"在其定义中导致后来维持时的模糊性。