我有下表:
+----+-------+---------+
| id | media | status |
+----+-------+---------+
| 1 | FOO | ACTIVE |
| 1 | FOO | PENDING |
| >1 | BAR | ACTIVE |
| 2 | FOO | ACTIVE |
| 2 | FOO | PENDING |
| >3 | BAR | ACTIVE |
+----+-------+---------+
我需要获得的是id
列表,其中ACTIVE
条记录包含某些media
,但没有PENDING
条记录media
}。在我的示例id=1
已涵盖FOO
,但未覆盖BAR
。
所以结果表应该是:
+----+
| id |
+----+
| 1 |
| 3 |
+----+
我看到的唯一解决方案是分别创建两个包含ACTIVE
和PENDING
记录的表,然后查找仅在ACTIVE
而非PENDING
中的记录。但我不知道如何构建请求。
请告知。
答案 0 :(得分:1)
我会使用group by
和having
执行此操作,因为这是一种非常灵活的方式来制定此类查询:
select id
from table t
group by id, media
having sum(status = 'ACTIVE') > 0 and
sum(status = 'PENDING') = 0;
答案 1 :(得分:1)
使用LEFT JOIN: -
SELECT a.id
FROM some_table a
LEFT OUTER JOIN some_table b
ON a.id = b.id
AND a.media = b.media
AND a.status = 'ACTIVE'
AND b.status = 'PENDING'
WHERE b.id IS NULL
这个自我加入表,一个用于活动,一个用于挂起。检查b.id IS NULL以检查是否没有匹配。
答案 2 :(得分:1)
SELECT DISTINCT id
FROM t
GROUP BY id, media
HAVING MAX(status) = 'ACTIVE';
这假设如果具有待处理媒体的ID仍具有不同的媒体类型而没有待处理,则仍应包括该ID。如果这不正确或不适用,您可以从SELECT中删除DISTINCT
,从GROUP BY中删除media
。
答案 3 :(得分:0)
您可以使用NOT EXISTS子句(NOT IN也可以使用)。
select distinct id
from table t
where status = 'ACTIVE'
and not exists (select null
from table
where t.id = id and t.media = media
and status = 'PENDING')
请参阅sqlFiddle
答案 4 :(得分:0)
GROUP CONCAT
select id from tbl group by media,id
having group_concat(status)='active'