在我的数据库中,我有用户、应用程序和版本。一个用户可以通过权限表拥有 0..n 个应用程序,一个应用程序可以拥有 0..n 个版本。
我正在尝试获取至少拥有 1 个应用程序的用户列表,但该用户的应用程序均未发布任何版本。
架构大致如下
users permissions apps releases
----- ----------- ---- --------
id user_id id id
email app_id app_id
我认为我已经有一些东西可以处理这个问题,但它对我来说似乎效率低下,因为我两次提到权限表并且我正在使用嵌套的存在子句。有没有更有效的方法来编写这个查询?
select u.email from users u
join permissions p on p.user_id = u.id
where not exists (
select a.id from apps a
join permissions p on p.app_id = a.id
where p.user_id = u.id and exists (
select r.id from releases r
where r.app_id = a.id
)
);
最佳答案
您只需要在发布上使用LEFT JOIN
,然后查找已发布的应用程序数量(r.app_id 不为 NULL)为 0 的情况。如果您想要的是用户列表,我认为您根本不需要JOIN
apps
表,因为JOIN
在权限
将确保仅包含拥有 1 个或多个应用程序权限的用户。
SELECT u.email
FROM users u
JOIN permissions p ON p.user_id = u.id
LEFT JOIN releases r ON r.app_id = p.app_id
GROUP BY u.email
HAVING COUNT(r.app_id) = 0
关于mysql - SQL 查询查找拥有未发布应用程序的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52694007/