mysql - Double Not Exists SQL 逻辑解释

标签 mysql sql querying

有 2 个表,一个称为 drinkers,有一列名称,另一个称为 frequents,有 2 个列,drinker 和 bar(他们经常光顾)。

我有一个查询可以回答这个陈述:

Drinkers who frequent all bars 

或不同的措辞:

Drinkers such that there aren’t any bars that they don’t frequent

查询结果如下:

SELECT d.name
FROM drinkers d
WHERE NOT EXISTS (
    SELECT b.name
    FROM bars b
    WHERE NOT EXISTS (
        SELECT *
        FROM frequents f
        WHERE f.drinker = d.name
        AND f.bar = b.name
        )
    )

当使用两个 NOT EXISTS 时,我很难遵循逻辑。 我如何理解这些类型的查询?

最佳答案

您可以尝试从内到外展开这些类型的查询。所以,从最后一个子查询开始:

SELECT *
FROM frequents f
WHERE f.drinker = d.name
AND f.bar = b.name

在这里,您要选择具有特定名称的特定酒吧的客户:换句话说,您要检查这个特定的饮酒者是否去这个酒吧。所以现在:

SELECT b.name
FROM bars b
WHERE NOT EXISTS (
    SELECT *
    FROM frequents f
    WHERE f.drinker = d.name
    AND f.bar = b.name
)

可以看作是这样的

SELECT b.name
FROM bars b
WHERE NOT EXISTS (this particular client in it)

在这里,您要选择没有此人作为客户的所有酒吧。因此,你最终会得到类似的东西

SELECT d.name
FROM drinkers d
WHERE NOT EXISTS (any bar without this guy as a client)

而且我认为此时查询应该看起来很清楚:选择没有他们就没有酒吧的所有饮酒者。

关于mysql - Double Not Exists SQL 逻辑解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32739694/

相关文章:

PHP MySQL 网站到外部 SQL 系统集成

sql "ranges"和通配符

php - 使用数据库中已有的值更新数据库的值

sql - SQL Server 中的嵌套 select 语句

repository - Typeorm:检查属性是否为值 1、2、3 或 n

php - 查询数据库时忽略撇号 - Laravel 5.4

php - Mysql在db字段中插入零,默认值为9999999

mysql - Laravel (5.6) Eloquent 电子商务关系

sql - PostgreSQL - 为非主键创建一个自增列

MySQL - 将部分数据从一个表复制到另一个