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