2013-10-04 50 views
2

我有一個計劃表,我可以使用recurring_id數據將某些事件分組爲相同的事件。問題是我需要在由recurring_id分組的事件列表中只獲取一個事件(最近的一個),但是如果recurring_id是0,我只需要列表,最多5個元素。事件表:以更簡單的方式獲取每個組的最近元素(最新元素)

+----+---------------------+---------------+ 
| id |  start  | recurrence_id | 
+----+---------------------+---------------+ 
| 1 | 2013-10-03 03:30:00 |    0 | 
| 2 | 2013-10-04 03:30:00 |    0 | 
| 3 | 2013-10-05 03:30:00 |    1 | 
| 4 | 2013-10-12 03:30:00 |    1 | 
| 5 | 2013-10-19 03:30:00 |    1 | 
| 6 | 2013-10-26 03:30:00 |    1 | 
| 7 | 2013-10-13 03:30:00 |    2 | 
| 8 | 2013-10-06 03:30:00 |    2 | 
+----+---------------------+---------------+ 

而且我有這個查詢(假設當前日期是2013-10-03T21:18:10 + 00:00)

SELECT * FROM 
((
    SELECT * FROM events e JOIN 
    (
     SELECT recurrence_id, MIN(start) start FROM events 
     WHERE recurrence_id <> 0 
     AND start > '2013-10-03T21:18:10+00:00' 
     GROUP BY recurrence_id 
    ) subq USING (recurrence_id, start) 
    ORDER BY start ASC 
    LIMIT 5 
) UNION (
    SELECT * FROM events e 
    WHERE start > '2013-10-03T21:18:10+00:00' 
    AND recurrence_id = 0 
    ORDER BY start ASC 
    LIMIT 5 
)) sq 
ORDER BY start ASC 
LIMIT 5 

它的工作,但我覺得我過複雜的話,也變得非常困難,以創建工作指標:S

預計輸出繼電器將是:

+----+---------------------+---------------+ 
| id |  start  | recurrence_id | 
+----+---------------------+---------------+ 
| 2 | 2013-10-04 03:30:00 |    0 | 
| 3 | 2013-10-05 03:30:00 |    1 | 
| 8 | 2013-10-06 03:30:00 |    2 | 
+----+---------------------+---------------+ 
+0

你能發表您的預期輸出基於樣本數據?謝謝。我知道你每組需要一個,但是對於組0,你需要排名前5位。 –

+0

是的,這是正確的,每組需要1個,最多5個問題是我還需要它按時間排序,而且更新的是「現在」。 –

回答

1

最有效方式得到的數據是通過使用一對夫婦的用戶定義的變量的排名:

SELECT ID, recurrence_id, start 
FROM ( 
    SELECT 
    ID, recurrence_id, start, 
    @rownum := IF(@prev = recurrence_id, @rownum + 1, 1) rank, 
    @prev := recurrence_id 
    FROM events, (SELECT @rownum := NULL, @prev := NULL) init 
    WHERE start > '2013-10-03T21:18:10+00:00' 
    ORDER BY recurrence_id, start 
) s 
WHERE (recurrence_id = 0 AND rank <= 5) OR (recurrence_id != 0 AND rank = 1) 
ORDER BY recurrence_id, start 

根據您的樣本數據,這將輸出:

| ID | RECURRENCE_ID |      START | 
|----|---------------|---------------------------| 
| 2 |    0 | October, 04 2013 03:30:00 | 
| 3 |    1 | October, 05 2013 03:30:00 | 
| 8 |    2 | October, 06 2013 03:30:00 | 

+0

您的查詢很有趣,我從未使用用戶定義的變量進行排名。但是,我添加了排序和時間條件,結果不是我所期望的,也許我做錯了? –

+0

@elGEoRgETheKiLLa我剛剛更新了答案以輸出您的預期結果。 –

+1

這真的很有用,非常感謝。不僅你回答了這個問題,而且還給出了一個不同的方式來進行查詢。 –