mysql - 使用 JOIN、WHERE、GROUPBY、COUNT 进行 SQL 查询

标签 mysql sql

下面是我正在使用的架构示例。

如何返回拥有权限但没有该权限的匹配认证的所有用户的 idname

例如,查询将返回 0,在本例中为 john,因为 john 具有“删除”权限,但没有匹配的“删除”认证。

(这个模式是任意的和人为的,我只是想了解这个查询的语法/选择逻辑)

users
=====
id  name
--------
0   john
1   joe

user_permissions
================
uid permission
--------------
0   'edit'
0   'delete'
1   'edit

user_certs
==========
uid cid
-------
0   'edit'
1   'edit'

我已经尝试过了,我知道最后一行是错误的。

SELECT DISTINCT id, name FROM users
LEFT JOIN user_permissions users ON users.uid = user_permissions.uid
LEFT JOIN user_certs ON users.id = user_certs.uid
WHERE (user.permission = 'delete')
GROUP BY id, name
HAVING (COUNT(user_certs.cid = 'delete') = 0)

最佳答案

获取所有没有匹配证书的权限,然后对用户进行分组:

select
  u.id,
  u.name
from
  users u
  inner join user_permissions p on p.uid = u.id
  left join user_certs c on c.uid = p.uid and c.cid = p.permission
where
  c.uid is null
group by
  u.id,
  u.name

关于mysql - 使用 JOIN、WHERE、GROUPBY、COUNT 进行 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31343379/

相关文章:

php - 等级系统中只能显示 2 个等级

MySQL 触发器 : is it possible to delete rows if table become too large?

mysql - InnoDB 中行锁定所需的快速解释

php - 如果列有要执行语法的字符串

mysql - 在 X 行后拆分表并在 While 循环中添加文本(使用 TCPDF)

java - SQL Server 2014 的 JDBC 驱动程序

mysql - 如何在同一查询中执行连续的 SELECTS

php - 使用php将动态html加载到dompdf中

mysql - MariaDB中的SQL如何使用2列中的数据从另一列中选择值?

php - Mysql查询使用同一个表中的其他列值分组获得第二和第三最小值