Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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_Having - Fatal编程技术网

Mysql SQL分组依据";拥有;所需的行

Mysql SQL分组依据";拥有;所需的行,mysql,sql,having,Mysql,Sql,Having,是否有一种简洁的方法可以使用have检查所需的行是否在GROUP BY中 以日期为例: turtle_id name 1 Mike 2 Ralph 3 Leo 4 Don 及 而SQL: SELECT turtle.name FROM turtle JOIN turtle_crush ON turtle_crush.turtle_id = turtle.turtle_id WHERE turtle_crus

是否有一种简洁的方法可以使用
have
检查所需的行是否在
GROUP BY

以日期为例:

turtle_id   name  
1           Mike
2           Ralph
3           Leo
4           Don

而SQL:

SELECT turtle.name
FROM turtle
JOIN turtle_crush ON turtle_crush.turtle_id = turtle.turtle_id
WHERE turtle_crush.crush_for IN ('Pizza', 'April Oneil')
GROUP BY turtle.turtle_id
HAVING (a crush on both "Pizza" and "April Oneil")
我意识到我可以做一些事情,比如让COUNT(*)>1,但这会给Don(id 4)一个假阳性,因为他喜欢“比萨饼”两次

编辑: 只需添加一个
WHERE
子句,就会返回拉尔夫,而他在那里没有一个
crush\u作为“披萨”

这应该可以:

SELECT t.turtle_name
FROM turtle t
INNER JOIN (SELECT turtle_id
            FROM turtle_crush
            WHERE crush_for IN ('Pizza','April Oneil')
            GROUP BY turtle_id
            HAVING COUNT(DISTINCT crush_for) = 2) tc
    on t.turtle_id = tc.turtle_id;
在此代码中,子查询首先过滤结果,其中
crush\u for
'Pizza'
'April Oneil'
。然后,它按
turtle\u id
进行分组,另一个条件是为
值选择具有两个不同
crush\u的
turtle\u id
s(从而确保只获得具有两个crush的
turtle\u id
s)。然后它与
海龟表连接以获得名称。

这应该可以:

SELECT t.turtle_name
FROM turtle t
INNER JOIN (SELECT turtle_id
            FROM turtle_crush
            WHERE crush_for IN ('Pizza','April Oneil')
            GROUP BY turtle_id
            HAVING COUNT(DISTINCT crush_for) = 2) tc
    on t.turtle_id = tc.turtle_id;

在此代码中,子查询首先过滤结果,其中
crush\u for
'Pizza'
'April Oneil'
。然后,它按
turtle\u id
进行分组,另一个条件是为
值选择具有两个不同
crush\u的
turtle\u id
s(从而确保只获得具有两个crush的
turtle\u id
s)。然后它与
turtle
表联接以获得名称。

将压榨列表放入
WHERE
子句中,按turtle ID分组,计算压榨类型的不同值,然后只保留至少有2个值的组(或在查询中放入的压榨次数):


将粉碎列表放在
WHERE
子句中,按海龟ID分组,计算粉碎类型的不同值,然后仅保留至少有2个值的组(或您在查询中放置的粉碎数量):


在分组之前放在哪个位置。@草莓,这是一个很好的观点。理想情况下,字符串(例如“Pizza”)不能构成良好的主键,所有表都应该规范化,但这种方式使提问更简单。@草莓,在更“正确”的场景中,我们可以使用类似“Pepperoni Pizza”和“Cheese Pizza”的东西,主键分别为
INT
1和2。这两个比萨饼可能与一个名为“食品”的父类有关。最初的问题是如何返回所有喜欢至少一种“食物”和至少一种“人”的海龟,并且需要在“父类别”表和“项目”表上有一个额外的
JOIN
。@草莓。。。主键应该是
INT
1或2-正如我对您问题的回答所描述的。。。“turtle_crush”表看起来更像4=>1和4=>2。那么“turtle_crush”表的主键将是一个复合键。第4-1行(Don和“辣味香肠比萨饼”)和第4-2行(Don和“奶酪比萨饼”)都是独特的,形式正常。在分组前放上。@草莓这是一个很好的观点。理想情况下,字符串(例如“Pizza”)不能构成良好的主键,所有表都应该规范化,但这种方式使提问更简单。@草莓,在更“正确”的场景中,我们可以使用类似“Pepperoni Pizza”和“Cheese Pizza”的东西,主键分别为
INT
1和2。这两个比萨饼可能与一个名为“食品”的父类有关。最初的问题是如何返回所有喜欢至少一种“食物”和至少一种“人”的海龟,并且需要在“父类别”表和“项目”表上有一个额外的
JOIN
。@草莓。。。主键应该是
INT
1或2-正如我对您问题的回答所描述的。。。“turtle_crush”表看起来更像4=>1和4=>2。那么“turtle_crush”表的主键将是一个复合键。第4-1行(Don和“辣味香肠比萨饼”)和第4-2行(Don和“奶酪比萨饼”)都是独一无二的,形式正常。但如果有一只对
科学
比萨饼
感兴趣的
海龟,这也将被算作
压碎。所以这并不完全正确,是吗?@Nebi不,这不会发生,因为有一个
在那里,crush_在('Pizza','April Oneil')
+1@Lamak是的,没关系。我曾两次想到在没有四月的Piaaza,但也没关系。我错了。@Lamak谢谢你的帮助Lamak。但是如果有一只<代码>海龟<代码>对<代码>科学<代码>和<代码>比萨饼<代码>感兴趣,这也算是<代码>压碎你的钱。所以这并不完全正确,是吗?@Nebi不,这不会发生,因为有一个
在那里,crush_在('Pizza','April Oneil')
+1@Lamak是的,没关系。我曾两次想到在没有四月的Piaaza,但也没关系。“我错了。”拉马克谢谢你的帮助。
SELECT turtle.name
FROM turtle
  INNER JOIN turtle_crush ON turtle_crush.turtle_id = turtle.turtle_id
WHERE crush_for IN ("Pizza", "April Oneil")
GROUP BY turtle.turtle_id
HAVING COUNT(DISTINCT crush_for) = 2