2012-09-01 57 views
6

我有一個架構如下表:MySQL的 - 在列表中的每個ID選擇2最後一個元素

id, field, time 
3, 'test0', 2012-08-29 
3, 'test1', 2012-08-30 
3, 'test2', 2012-08-31 
2, 'test0', 2012-08-19 
2, 'test1', 2012-08-20 
2, 'test2', 2012-08-26 
... 

我需要在列表中的每個ID找到它的最後和之前的最後一個值。 例如如果ID = [2,3]的結果應該返回

3, 'test1', 2012-08-30 
3, 'test2', 2012-08-31 
2, 'test1', 2012-08-20 
2, 'test2', 2012-08-26 

如果我將只需要最後的值,我會用

SELECT * 
FROM table 
WHERE id IN (2, 3) 
GROUP BY id 

任何想法我怎麼能做到這一點?

+0

小組將按照所有ID給出單個結果。 – hjpotter92

+0

你可以利用時間列上的'SORT'和LIMIT'子句結合起來。 –

回答

3

如果您的每個身份證號碼的時間都是唯一的,這將起作用。

SELECT d.id, d.field,d.time 
    FROM d d 
    JOIN (
    SELECT max(d.time)m, d.id 
     FROM d 
     JOIN (
     SELECT max(time) m, id 
      FROM d 
     GROUP BY id 
    )e ON d.id=e.id AND e.m>d.time 
     GROUP BY d.id 
    )e ON d.time >= e.m AND d.id = e.id 

這是如何工作的。此嵌套查詢獲取每個ID的最新時間。

  SELECT max(time) m, id 
      FROM d 
     GROUP BY id 

然後,又將這個被嵌套在此查詢,它給你的每個ID的第二到最新的時間(即排除了最新的時間行的子集的最新時間)。

SELECT max(d.time)m, d.id 
     FROM d 
     JOIN (
     SELECT max(time) m, id 
      FROM d 
     GROUP BY id 
    )e ON d.id=e.id AND e.m > d.time 

最後,完整的查詢(第一如上所示)獲取所有的行與時間大於或等於第二最新時刻。

如果您的時間不是唯一的 - 也就是說,您有一些行中出現相同的ID和時間,您可能會爲每個ID獲取兩個以上的行。但你總是會得到最近兩次。

如果一個特定的ID只有一行,你不會得到它。

只有您知道這些限制是否可以接受。

小提琴! http://sqlfiddle.com/#!2/82719/5/0

1

試試這個

SELECT * 
    FROM table 
    WHERE id = '1' 
    ORDER BY `id` desc 
    LIMIT 0,2 
UNION 
    SELECT * 
    FROM table 
    WHERE id = '2' 
    ORDER BY `id` desc 
    LIMIT 0,2 

UPDATE:

如果也可以嘗試這樣的事:

SELECT t1.* 
FROM `tablename` t1 
LEFT OUTER JOIN `tablename` t2 
    ON (t1.id = t2.id AND t1.time > t2.time) 
GROUP BY t1.id, t1.field, c1.time 
HAVING COUNT(*) < 2; 

Reference

相關問題