Mysql 双精度不存在SQL逻辑解释
共有两个表,一个称为drinkers,有一列名称,另一个称为frequents,有两列,drinker和bars(他们经常使用) 我有一个问题可以回答这个问题:Mysql 双精度不存在SQL逻辑解释,mysql,sql,querying,Mysql,Sql,Querying,共有两个表,一个称为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 (
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
)
)
当使用两个不存在时,我最难遵循逻辑。
如果有人能教我如何理解这些类型的查询,我将不胜感激。谢谢。您可以尝试从内到外展开此类查询。因此,从最后一个子查询开始:
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)
在这里,您选择的是所有没有此人作为客户的酒吧。因此,你最终会得到这样的结果
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)
我认为在这一点上,查询应该是明确的:选择所有没有酒吧的饮酒者。我不知道你是否绝对需要通过那些不存在的循环,因为你完全可以这样做
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中添加这些不同的子句允许您忽略重复项