【发布时间】:2012-07-16 05:18:57
【问题描述】:
我有两张桌子
具有列的用户:uid、姓名、邮件等
users_roles 列:uid, rid
在 users_roles 中,每次向用户添加角色时,都会在 users_roles 表中列出该角色。因此,假设用户 1 具有角色 1 和 4。在表格中:
users_roles:
uid | rid
1 | 1
1 | 4
我需要返回所有不具有角色 4 或 5 的用户。我尝试将 Group By 和 Distinct 与 NOT IN 结合使用。我一直遇到的问题是,如果用户同时具有角色 1 和 4,它们将在结果中返回。以下是我的 Group By 查询示例:
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 在完成查询后合并了行。因此,它只是找到包含 uid 1 rid 4 的记录并在结果中返回它。
我无法使用的 Drupal 模块 Views(由于 Views Bulk Operations 的安全问题)通过执行以下操作实现了预期的结果:
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 函数可以让我获得角色 ID 列表,我可以在其中取消设置我不希望出现在结果数组中的角色,但我觉得我缺少对 SQL 的基本理解。有没有更好的方法在 SQL 中做到这一点?
【问题讨论】: