2010-10-22 29 views
0

其實我甚至不知道如何調用這樣的:P,但...非常複雜的集團通過由SQL命令/獨特/限制

我有一個表,讓我們把它稱爲「上傳」

id owner date 
----------------------------- 
0  foo  20100101120000 
1  bar  20100101120300 
2  foo  20100101120400 
3  bar  20100101120600 
.. ..  .. 
6  foo  20100101120800 

現在,當I'ld做這樣的事情:

SELECT id FROM uploads ORDER BY date DESC 

這將導致:

id owner date 
----------------------------- 
6  foo  20100101120800 
.. ..  .. 
3  bar  20100101120600 
2  foo  20100101120400 
1  bar  20100101120300 
0  foo  20100101120000 

問題:不錯,但是,我想走得更遠。因爲現在,當你想建立一個時間表(而且我做了:P)時,你被'垃圾郵件'通過消息說foo和bar上傳了一些東西。我想對它們進行分組,並在日期字段中返回時間限制爲'500'的第一個結果。

什麼樣的SQL命令的,我需要的是會導致:

id owner date 
----------------------------- 
6  foo  20100101120800 
3  bar  20100101120600 
0  foo  20100101120000 

然後,在這之後,我可以爲每個記錄進行調用以獲取在5分鐘的時間內完成關聯記錄(這是id = 6的示例):

SELECT id FROM uploads WHERE date>=20100101120800-500 ORDER BY date DESC 

現在有人應該怎麼做第一步嗎? (如此限制/分組的結果)

(btw。我知道,當我想要使用這個,我應該將每個日期(YmdHis = 60)轉換爲Unix時間(= 100),但我不需要5分鐘正好5分鐘,它們可能會稍微減少一分鐘...)

回答

1

我不太清楚你想要得到的結果,即使是你的例子。也許是一些四捨五入的組合。

SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date 
FROM uploads GROUP BY date_interval,owner 

您可能想使用FLOOR或CEILING而不是ROUND,具體取決於您想要的。

+0

這正是我的意思。我現在使用「SELECT id FROM uploads GROUP BY ROUND(UNIX_TIMESTAMP(date)/ 3600),owner」。我使用3600,因爲我認爲1小時比5分鐘更好。在Reinierpost提到「間隔」之後,我開始使用Google搜索到「MySQL Group By Interval」,我發現這個:http://forum.percona.com/index.php/t/748/,這非常有幫助! 無論如何,非常感謝Reinierpost,Symcbean和Brent! – elslooo 2010-10-22 16:25:27

1

標準SQL不處理間隔很好。 您將需要執行表的自連接以比較不同元組的日期。這樣,你可以很容易地找到所有日期不超過500個元組的元組對。 但是,您真的想要將集合中的日期聚集在不超過500個集合中 - 並且根據我的理解,這些集合中不能用SQL表示。

你可以做的事情非常相似:將總時間間隔分成固定的500個單位範圍,然後根據它們所在的時間間隔對錶中的所有元組進行聚類。爲此,首先需要一張表或查詢結果與間隔的開始時間;可以使用表上的SQL查詢和將時間戳「舍入」到其間隔中的開始時間或者計算其間隔序號的函數來創建。然後,作爲第二步,您可以將該結果加入表中,根據其相應的開始時間對其時間戳進行分組。我無法提供SQL,因爲它依賴於DBMS,而且我當然不能告訴你這是否是在您的情況下完成所需任務的最佳方式。

1

使用內聯視圖?例如像

SELECT u1.* 
FROM uploads u1, 
(SELECT date 
    FROM uploads u2 
    WHERE u2.owner='foo') datum_points 
WHERE u1.date BETWEEN datum_points.date 
    AND DATE_ADD(datum_points.date INTERVAL 5 MINUTES) 

應返回'foo'發出5分鐘內發出的所有帖子。