MySQL查询查找唯一记录

时间:2014-07-07 15:52:17

标签: mysql sql

我有下表:

+----+-------+---------+
| 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 |
+----+

我看到的唯一解决方案是分别创建两个包含ACTIVEPENDING记录的表,然后查找仅在ACTIVE而非PENDING中的记录。但我不知道如何构建请求。

请告知。

5 个答案:

答案 0 :(得分:1)

我会使用group byhaving执行此操作,因为这是一种非常灵活的方式来制定此类查询:

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'