SQL having子句用于选择具有布尔标志状态的记录

时间:2012-06-28 11:28:13

标签: sql group-by having

我有一个scheduled_item表,可以安排动画显示。

播放动画后,其属性is_played将设置为true。

当播放完所有动画后,调度程序会将先前显示的动画添加到队列中,因此屏幕始终会播放一些动画。

当新动画到达时,需要在队列之前添加 - 理想情况下替换下一个要播放的项目。

schedule_item如下所示:

CREATE TABLE scheduled_item (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `animation_id` bigint(20) DEFAULT NULL,
  `is_played` tinyint(1) NOT NULL DEFAULT '0'
);

有些行看起来像这样

+----+--------------+-----------+
| id | animation_id | is_played |
+----+--------------+-----------+                                           
| 17 |           15 |         1 |
| 40 |           22 |         1 |
| 43 |           26 |         1 |
| 46 |           15 |         1 |
| 49 |           22 |         0 |
+----+--------------+-----------+

所以,我试图了解尚未播放的所有动画,但过去曾播放过。在这种情况下,我正在寻找id 49 / animation_id 22。

所以这就是我想出来的,它似乎正在起作用,但是:

SELECT item_id
FROM scheduled_item
GROUP BY animation_id
HAVING count( animation_id ) > 1
AND MIN( is_played ) < 1
AND MAX( is_played ) > 0
ORDER BY id ASC;
  • 有更好的方法吗?
  • 我得到了正确的结果吗?

1 个答案:

答案 0 :(得分:1)

尝试此查询 - 在这种情况下您不需要having子句。

select item_id from scheduled_item 
    where is_played = 0 and 
    item_id in(
        select p.item_id from scheduled_item p 
             where p.animation_id = animation_id and 
             p.item_id < item_id and is_played = 1
    )