在时间戳间隔内选择多个值

时间:2014-12-29 00:17:30

标签: mysql sql

我有一个(MySQL)表,如下所示:

`radiostation_id` varchar(36) NOT NULL,
`song_id` varchar(36) NOT NULL,
`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`length` int(4) NOT NULL

我想要做的是找到在15分钟内播放的每个song_id。可能是这首歌在今天15:10播放,然后再播放15:20。所以我不应该自己设置间隔,它应该检查表格中的任何间隔,并列出它发生的所有歌曲和时间戳。

4 个答案:

答案 0 :(得分:0)

你所要求的并不完全清楚。

如果要查找相同 song_id的匹配项,其中具有相同song_id的第二行的日期值在第一行的15分钟内,获得它的方法是这样的查询:

SELECT t.song_id
  FROM looks_like_this t
 WHERE EXISTS ( SELECT 1
                  FROM looks_like_this s 
                 WHERE s.song_id = t.song_id
                   AND s.date >= t.date 
                   AND s.date <= t.date + INTERVAL 15 MINUTE
                   AND NOT (s.radiostation_id = t.radiostation_id AND s.date = t.date)

如果您想要返回song_id的唯一列表,请添加DISTINCT关键字或GROUP BY t.song_id子句。

获得结果的另一种方法是使用JOIN操作:

SELECT t.song_id
  FROM looks_like_this t
  JOIN looks_like_this s
    ON s.song_id = t.song_id
   AND s.date >= t.date
   AND s.date <= t.date + INTERVAL 15 MINUTE
   AND NOT (s.radiostation_id = t.radiostation_id AND s.date = t.date)
 GROUP BY t.song_id 

答案 1 :(得分:0)

以下内容将显示最后一次播放的最后15分钟内的所有行。

SELECT * FROM myTable
WHERE date>= NOW() - INTERVAL 15 MINUTE

请注意,在表列中使用日期是不好的做法,因为它是一个保留的mysql单词。

答案 2 :(得分:0)

在我看来,无论白天如何,你都希望在15分钟内播放一首歌。您可以使用date and time functions来解析所需的信息。例如,您可以使用TIME()来提取列的时间部分。例如,您可以搜索在12:00和12:15之间播放的任何歌曲,如下所示:

SELECT DISTINCT id
FROM myTable
WHERE TIME(timeColumn) BETWEEN '12:00:00' AND '12:15:00';

这是我曾经尝试过的一点SQL Fiddle

修改

根据我们在评论中的讨论,您可以使用以下查询。它将在song_id匹配的情况下自动加入表(因此您可以比较单个歌曲),时间不完全相同的条件(因此没有计数两次)和第二个时间间隔的条件表格在第一个的+/- 15分钟内如下:

SELECT m.song_id, m.timecolumn
FROM myTable m
JOIN myTable mt 
  ON m.song_id = mt.song_id
  AND m.timeColumn != mt.timeColumn
  AND mt.timeColumn BETWEEN DATE_SUB(m.timeColumn, INTERVAL 15 MINUTE) AND DATE_ADD(m.timeColumn, INTERVAL 15 MINUTE);

以下是更新的Fiddle

答案 3 :(得分:0)

您只需要在播放时列出所有歌曲,如果在15分钟后再次播放,则连接到同一首歌。

select  pt1.ID, pt1.StartDate, pt2.StartDate StartDate2
from    PlayTimes  pt1
join    PlayTimes  pt2
    on  pt2.ID = pt1.ID
    and pt2.StartDate > pt1.StartDate
    and pt2.StartDate <= Date_Add( pt1.StartDate, interval 15 minute );

你没有提到广播电台是否扮演任何角色。如果在15分钟内即使在不同的电台上再次播放,上面的查询也将返回一首歌曲。这是有道理的。如果您只需要在同一电台上15分钟内再次播放的歌曲,则将电台ID添加到连接条件。电台是否会这样做(在15分钟内播放同一首歌两次)?或者你是否正在检查以确保电台永远不会这样做?