仅选择列中所有值都与 id 值匹配的行

Mag*_*hea 4 mysql query select

给定表

序列号 序列状态
1 A
1
2 A
2 A
3 A
4
5 C

我想选择不同的 seq_id,其中 seq_status 为 A(2 和 3),并且如果其中一个值不同则不返回

到目前为止我有一些看起来像这样的东西

SELECT distinct(s.seq_id) FROM sequence s
having s.seq_id IN (
    select z.seq_id
    from sequence z
    group by z.seq_id, z.seq_status
    having z.seq_status = "A" )
Run Code Online (Sandbox Code Playgroud)

但这会返回带有 seq_status A 的任何 seq_id,并且我只查找 seq_id,其中 seq_status 全部与所需值匹配

Pau*_*ite 6

还有另一种选择:

# All non-NULL seq_status values per seq_id contain 'A'
SELECT s.seq_id
FROM sequence AS s
GROUP BY s.seq_id
HAVING SUM(s.seq_status = 'A') = COUNT(*);
Run Code Online (Sandbox Code Playgroud)

这是可行的,因为比较运算的结果为 1 (TRUE)、0 (FALSE) 或 NULL。

有很多替代方案,包括:

HAVING COUNT(DISTINCT seq.status) = 1 AND MIN(seq_status)='A'
HAVING SUM(s.seq_status <> 'A' OR seq.status IS NULL) = 0
Run Code Online (Sandbox Code Playgroud)

更不用说使用EXISTSor编写的查询了= ALL


或者如果你想忽略 NULL:

SELECT s.seq_id
FROM sequence AS s
GROUP BY s.seq_id
HAVING MIN(s.seq_status) = 'A'
   AND MAX(s.seq_status) = 'A';
Run Code Online (Sandbox Code Playgroud)

db<>小提琴演示