mysql Double不存在SQL逻辑解释

yacmzcpb  于 2023-01-16  发布在  Mysql
关注(0)|答案(2)|浏览(139)

有两个表,一个叫drinkers,有一列名字,另一个叫frequents,有两列,drinker和bars(他们经常去的)。
我有一个问题可以回答这个问题:

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时,我最难理解逻辑。我如何理解这些类型的查询?

ycl3bljg

ycl3bljg1#

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

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

在这里,您选择具有特定名称的特定酒吧的客户端:换句话说,你是在检查这个特定的饮酒者是否去过这个酒吧。2那么现在:

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)

我想在这一点上,这个问题应该很清楚了:选择所有的饮酒者,没有他们就没有酒吧。

r1zk6ea1

r1zk6ea12#

我不知道您是否一定需要执行这些 NOT EXISTS 循环,因为您完全可以执行类似的操作

SELECT d.name
FROM drinkers d 
INNER JOIN frequents f ON f.drinkerName = d.name
GROUP BY d.name
HAVING COUNT(distinct barName) = 
    (SELECT COUNT(distinct barName) 
     from frequents
)

基本上,先计算酒吧的总数,然后将每个人经常光顾的酒吧数与该总数进行比较,在COUNT中添加这些 distinct 子句可以忽略重复项。

相关问题