2012-02-24 47 views
3

我有一個將存儲事件的數據庫。每個事件都有不同的活動。該數據庫作出這樣(我知道這是不是最好的數據庫設計,但我什麼是給我的工作):選擇列出了所有活動的最近事件SQL

eventID | date  | eventname | activity 
___________________________________________ 
0001 | 01/01/2012 | name1  | activty1 
0002 | 01/01/2012 | name1  | activty2 
0003 | 01/05/2012 | event2 | activty1 
0004 | 01/05/2012 | event2 | activty2 
0005 | 01/07/2012 | name1  | activty1 

同一個事件可以有多個活動。我可以從事件(活動)獲取所有記錄的唯一方法是通過eventname列。

我想要做的是獲得最後20個事件與它的所有活動。因此,我不能簡單地選擇20行(使用LIMIT,因爲這不會每次得到20個事件,因爲有些事件有2個活動,其他10個)。

我不能使用SELECT DISTINCT eventname,因爲某些事件在不同的日期有相同的名稱。我需要的是隻有在日期不同的情況下才有獨特的事件名稱。

我迷失了方向。

謝謝。

+0

您是否想要最近的20個事件,但每個事件名只能表示一次? – 2012-02-24 16:18:35

+0

@ConradFrix我正在尋找20個活動,以及他們的所有活動。我期望獲得代表20個事件的基本記錄數x。 - 希望這是有道理的。 – blo0p3r 2012-02-24 17:01:31

+0

你可以查詢最近20個事件,然後在遊標中循環它們,查找每個事件的所有活動,然後將這些事件插入到一個表對象中,然後返回這些行?可能不是最快的方法,但它會非常簡單。 – Ted 2012-02-24 17:17:26

回答

2
SELECT 
    * 
FROM 
    event 
INNER JOIN 
(
    SELECT eventName, Date 
    FROM  events 
    GROUP BY eventName, Date 
    ORDER BY Date DESC 
    LIMIT 20 
) 
    AS last_20_events 
    ON last_20_events.eventName = events.eventName 
    AND last_20_events.Date  = events.Date 
+0

關閉,這是有道理的,但我的eventIDs是不同的。數據庫中的每個條目的eventID都不相同。我已經編輯了一些問題來顯示這個。 – blo0p3r 2012-02-24 16:56:14

+0

這裏給了我最後20條記錄,但它會超過20條記錄,因爲我想要20個事件,而不是20個活動。 – blo0p3r 2012-02-24 17:00:11

+0

只需將eventID的引用更改爲eventName即可。 – 2012-02-24 17:11:11

0
SELECT eventName, date, 
GROUP_CONCAT(activity ORDER BY activity SEPARATOR ', ') 
FROM events 
GROUP BY eventName, date 
ORDER BY date desc 
LIMIT 20 

我沒有在時刻訪問MySQL數據庫,所以我一直沒能對此進行測試。此答案基於SO上的其他已接受答案(搜索group_concat)