2013-03-01 43 views
2

比方說,你有如下表(這裏感興趣的列binid):MySQL的選擇最後一個唯一出現

id datetime     agid binid status 
1 2013-02-01 11:03:49  0  25 1 
2 2013-02-01 11:03:53  0  25 1 
3 2013-02-01 11:04:21  0  26 1 
4 2013-02-01 11:04:23  0  26 0 
5 2013-03-01 11:04:26  0  25 0 
6 2013-03-01 11:04:30  0  36 0 
7 2013-03-01 11:04:34  0  36 1 
8 2013-03-01 11:04:35  0  36 1 
9 2013-03-01 11:04:36  0  36 1 
10 2013-03-01 11:04:39  0  36 0 
11 2013-03-01 11:04:41  0  36 1 
13 2013-03-01 11:04:50  0  25 1 
14 2013-03-01 11:04:53  0  26 1 
15 2013-03-01 11:15:25  0  25 1 
16 2013-03-01 11:15:30  0  25 0 
17 2013-03-01 11:15:39  0  23 1 
18 2013-03-01 11:15:43  0  26 1 

我如何可以提取發生在一定的時間內每個binid最後出現的?

這是我在用至今:

SELECT * FROM (reports ORDER BY datetime ASC) 
WHERE datetime >= TIMESTAMP('2013-03-01') 
GROUP BY binid 

但它返回第一個分身來代替。我怎樣才能返回每個唯一binid的最後一次出現?

+0

如果你改變ASC到DESC會發生什麼? – 2013-03-01 19:39:15

+0

'ORDER BY ID DESC'或'ORDER BY datetime DESC'是否有效? – 2013-03-01 19:40:43

回答

8

您應該使用子查詢得到的結果:

select r1.* 
from reports r1 
inner join 
(
    select max(datetime) MaxDate, binid 
    from reports 
    WHERE datetime >= TIMESTAMP('2013-03-01') 
    group by binid 
) r2 
    on r1.binid = r2.binid 
    and r1.datetime = r2.maxdate 
WHERE r1.datetime >= TIMESTAMP('2013-03-01') 

SQL Fiddle with Demo

的問題是,當你在一個單一的柱,使用GROUP BY那麼MySQL可以爲返回一個意外的值其他欄不在GROUP BY。 (見MySQL Extensions to GROUP BY)。

從MySQL的文檔:

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考在GROUP BY子句中未命名的非聚合列。 ...您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這非常有用,因爲每個未在GROUP BY中命名的非聚合列中的所有值對於每個組都是相同的。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。結果集的排序在選擇值後發生,而ORDER BY不影響服務器選擇的值。

+0

這正是我所尋找的。我不知道團隊可以選擇任何意想不到的價值。非常感謝 – triden 2013-03-01 19:58:01

-3

更改ORDER BY ASCORDER BY DESC。應該做的伎倆。

+0

查看@bluefeet的評論爲什麼這不起作用 – 2013-03-01 19:46:14

0
SELECT * FROM (reports ORDER BY datetime DESC) 
WHERE datetime >= TIMESTAMP('2013-03-01') 
GROUP BY binid LIMIT 1 
3
SELECT binid, 
     SUBSTRING_INDEX(GROUP_CONCAT(agid ORDER BY datetime DESC), ',', 1) AS agid, 
     SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY datetime DESC), ',', 1) AS status 
FROM reports 
WHERE datetime <= TIMESTAMP('2013-03-01') 
GROUP BY binid; 
+1

+1。 。 。我碰巧認爲這是一個在MySQL中未被充分利用的巧妙方法。 – 2013-03-01 19:54:47