SQL GROUP BY "HAVING" 需要的行
SQL GROUP BY "HAVING" the required rows
是否有使用 HAVING
检查所需行是否在 GROUP BY
内的简洁方法?
以日期为例:
turtle_id name
1 Mike
2 Ralph
3 Leo
4 Don
和
turtle_id crush_for
1 Pizza
1 April Oneil
2 April Oneil
3 Pizza
3 April Oneil
4 Pizza
4 Pizza
4 Science
4 April Oneil
和 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")
我知道我可以做类似 HAVING COUNT(*) > 1
的事情,但这会给 Don (id 4) 一个误报,因为他喜欢 'Pizza' 两次。
编辑:
只需添加一个 WHERE
子句就会 return Ralph 他没有 crush_for
'Pizza'
这应该有效:
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_for
为 'Pizza'
或 'April Oneil'
的结果。然后它按 turtle_id
分组,另一个条件是选择那些具有 2 个不同 crush_for
值的 turtle_id
s(因此确保您只获得具有两个 crushes 的 turtle_id
s ).然后它与 turtle
table 一起得到名称。
将 crush 列表放在 WHERE
子句中,按海龟 ID 分组,计算 crush 类型的不同值,然后仅保留具有至少 2 个值(或您放入的 crush 数量)的组查询):
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
是否有使用 HAVING
检查所需行是否在 GROUP BY
内的简洁方法?
以日期为例:
turtle_id name
1 Mike
2 Ralph
3 Leo
4 Don
和
turtle_id crush_for
1 Pizza
1 April Oneil
2 April Oneil
3 Pizza
3 April Oneil
4 Pizza
4 Pizza
4 Science
4 April Oneil
和 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")
我知道我可以做类似 HAVING COUNT(*) > 1
的事情,但这会给 Don (id 4) 一个误报,因为他喜欢 'Pizza' 两次。
编辑:
只需添加一个 WHERE
子句就会 return Ralph 他没有 crush_for
'Pizza'
这应该有效:
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_for
为 'Pizza'
或 'April Oneil'
的结果。然后它按 turtle_id
分组,另一个条件是选择那些具有 2 个不同 crush_for
值的 turtle_id
s(因此确保您只获得具有两个 crushes 的 turtle_id
s ).然后它与 turtle
table 一起得到名称。
将 crush 列表放在 WHERE
子句中,按海龟 ID 分组,计算 crush 类型的不同值,然后仅保留具有至少 2 个值(或您放入的 crush 数量)的组查询):
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