首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL --如何在SQL中获得一个给定条件的重复记录?

MySQL --如何在SQL中获得一个给定条件的重复记录?
EN

Stack Overflow用户
提问于 2017-10-27 16:13:58
回答 1查看 29关注 0票数 0

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

在ID 6的用户“阿德里亚娜·史密斯”被重复的地方,因为她有不同的合同日期,为此,我从表bo_users到bo_users_contracts (1: Many to bo_users_contracts)做了一个左联接。查询如下:

代码语言:javascript
复制
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)。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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;或者第三个表中的左边联接应该是一个内部连接。

代码语言:javascript
复制
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子句限制移动到联接。我指出这一点,因为您的查询在它的定义中是“不一致的”,在以后维护时会导致歧义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46979396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档