2013-08-24 80 views
1

我正在想方法來計算MySQL表中特定行的最有效方法。只計算彼此之間30分鐘的行數?

我的表格包含一個名爲date_timedatetime列,我想要計算每個date_time之間至少有30分鐘的行數。

例如,可以說我有如下表:

id date_time 
1  2013-08-23 00:30:00  
2  2013-08-23 00:45:00  
3  2013-08-23 01:01:00  
4  2013-08-23 02:30:00  
5  2013-08-23 02:45:00 

如果我只想包括一個條目;如果不存在,因爲在最後一項至少30分鐘,然後計數將包括ID#1和編號#4,因此計數將是2.

我想要拿出一個乾淨的腳本來做到這一點,是否有任何特殊類型的查詢,將幫助我完成此?

+1

你的意思是30秒?因爲你的數據肯定在幾秒鐘內。 – Prix

+0

你的意思是第一次進入嗎?當你的意思是「因此計數是2」,你的意思是你想限制它2結果?因爲我不知道你會如何選擇id 1和id 4,因爲還有其他人在id 1後超過30秒。 – Mike

+1

@Prix ahh我的意思是分鐘,我道歉。我會立即更新。謝謝邁克,桌子上有成千上萬的行,所以我不想限制爲兩個。我也意味着分鐘... – user2492064

回答

2

爲很簡單的解決方法是使用DATE_FORMAT MySQL函數。

http://sqlfiddle.com/#!2/3b793/4

查詢

SELECT 
    DATE_FORMAT(`datef`, '%i') AS `Fields`, 
    `datef` 
FROM `dates` 
WHERE DATE_FORMAT(`datef`, '%i') = 30 
+0

它爲你工作..? –

+0

這將在分鐘內輸出所有具有「30」的條目 - 比如11:30:56,12:30:23等等......這個答案如何有2個喜歡? – Gerfried

1

這應該工作。假定表名爲 「time_list」 和IDS和時間順序...

SELECT 
    count(1) 
FROM `time_list` 
    LEFT OUTER JOIN `time_list` AS `a` 
    ON (`time_list`.`id` = (`a`.`id` + 1)) 
WHERE (
    (to_seconds(`time_list`.`date_time`) - to_seconds(`a`.`date_time`))/60 >= 30 
    OR `a`.`id` IS null); 
2

您可以使用MySQL變量(SQLFiddle):

SET @x := NULL; 
SELECT count(*) FROM (
    SELECT @x AS prev, @x:=date_time AS curr 
    FROM mytable 
    ORDER BY id 
) y 
WHERE curr > prev + interval 30 minute 
    OR curr < prev