首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DISTINCT或GROUP BY与NOT IN一起使用会返回错误的结果

DISTINCT或GROUP BY与NOT IN一起使用会返回错误的结果
EN

Stack Overflow用户
提问于 2012-07-16 13:18:58
回答 3查看 162关注 0票数 2

我有两张桌子

具有列的用户: uid、名称、邮件等

包含列的users_roles : uid、rid

在users_roles中,每次向用户添加角色时,都会在users_roles表中列出该角色。因此,假设用户1具有角色1和4。在该表中:

代码语言:javascript
复制
users_roles:  
uid | rid  
 1  |  1  
 1  |  4  

我需要返回所有没有角色4或5的用户。我已经尝试将Group By和Distinct与NOT IN结合使用。我经常遇到的问题是,如果用户同时具有角色1和角色4,则它们将在结果中返回。下面是my Group By查询的一个示例:

代码语言:javascript
复制
SELECT *
FROM users AS u
LEFT JOIN users_roles AS ur ON u.uid = ur.uid
WHERE ur.rid NOT
IN ( 4, 5 )
GROUP BY ur.uid

我也尝试了子查询,但都没有用,因为问题似乎是Group By在完成查询后合并了行。因此,它只是找到包含uid1RID4的记录,并在结果中返回它。

我不能使用的Drupal模块视图(由于视图批量操作的安全问题)通过执行以下操作实现了预期的结果:

代码语言:javascript
复制
LEFT JOIN users_roles ON users.uid = users_roles.uid 
AND (users_roles.rid = '4' OR users_roles.rid = '5')

对于长期维护,我不希望每次添加角色时都要更新代码,这将导致一个很长的查询。

我看了以下内容:

Aggregating Rows

Filtering distinct rows in SQL

虽然有一些Drupal函数可以让我获得角色in列表,我可以在其中取消设置我不希望在结果数组中显示的角色,但我觉得我缺少对SQL的基本理解。在SQL中有没有更好的方法来做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-16 13:30:10

我需要返回所有没有角色4和5的用户

代码语言:javascript
复制
select  *
from    users u
where   not exists
        (
        select  *
        from    users_roles ur
        where   ur.rid in (4,5)
                and ur.uid = u.uid
        )
票数 0
EN

Stack Overflow用户

发布于 2012-07-16 14:04:03

如果您想检查4和5是否都不存在(并且不一定是其中之一),您可以使用

代码语言:javascript
复制
select  * 
from    users u 
where   not exists 
        ( 
        select  uid
        from    users_roles ur 
        where   ur.rid in (4,5)     
                and ur.uid = u.uid 
    group by uid having count(distinct rid)=2
        ) 

如果列表很长,可以使用包含所有可能值的映射表,并在上面的查询中使用该映射表

票数 0
EN

Stack Overflow用户

发布于 2012-07-16 17:56:49

我想这样做:

代码语言:javascript
复制
SELECT *
FROM users AS u
LEFT JOIN users_roles AS ur ON (u.uid = ur.uid AND ur.rid IN ( 4, 5 ) )
WHERE ur.rid IS NULL
GROUP BY u.uid
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11498478

复制
相关文章

相似问题

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