Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 双精度不存在SQL逻辑解释_Mysql_Sql_Querying - Fatal编程技术网

Mysql 双精度不存在SQL逻辑解释

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,有一列名称,另一个称为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
        )
       )
当使用两个
不存在时,我最难遵循逻辑。

如果有人能教我如何理解这些类型的查询,我将不胜感激。谢谢。

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

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中添加这些不同的子句允许您忽略重复项