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_ids(因此确保您只获得具有两个 crushes 的 turtle_ids ).然后它与 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