mysql - SQL 查询查找拥有未发布应用程序的用户

标签 mysql sql performance join exists

在我的数据库中,我有用户、应用程序和版本。一个用户可以通过权限表拥有 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 的情况。如果您想要的是用户列表,我认为您根本不需要JOINapps表,因为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/

相关文章:

php - 我想创建类似于facebook的状态和评论系统

mysql - SQL BETWEEN 字符串,其中第二个是最小的

php - 如何从具有不同外键名称的两个表中获取数据

sql - 如何删除不需要的行值,然后根据 ADF/Azure SQL DB 中的键合并行?

javascript - 提高 Angular 性能: change the view to reactjs or Mithril?

python - 基于另一个数组对索引图像重新着色的快速方法

php - 如何在PHPExcel报表中连接数组中的数据

mysql - 困惑如何进行查询..自连接还是通过子查询?

mysql - MySQL 中何时使用单引号、双引号和反引号

Python Numpy 计算不循环