2010-03-11 98 views
3

我有多個用戶與多個條目的目的地SQL組和秩序

不知怎的,記錄他們到達時,我選擇查詢我想只顯示每個唯一的用戶名最新的條目。

這裏是不起作用的代碼:

SELECT * FROM $dbTable GROUP BY xNAME ORDER BY xDATETIME DESC 

這確實名稱分組很好,但就只顯示其最新的條目,只是表示它看到在SQL中的第一項表。

我想我的問題是,這可能嗎?

這裏是我的數據樣本:

john 7:00 
chris 7:30 
greg 8:00 
john 8:15 
greg 8:30 
chris 9:00 

和我期望的結果只能是

john 8:15 
chris 9:00 
greg 8:30 
+0

我們需要看到您選擇的列。 – 2010-03-11 21:35:53

+3

不要使用select *,這是你的問題,你必須告訴它什麼時候分組記錄。無論如何,選擇*是一個糟糕的做法。它不應該出現在生產代碼中。 – HLGEM 2010-03-11 21:41:02

+1

讓我猜猜:MySQL?我還沒有看到另一個SQL服務器,它允許你用'GROUP BY'子句'SELECT *'。另一方面,MySQL假定您想在所有不是聚合的列上分組。 – Powerlord 2010-03-11 21:42:06

回答

8

如何像

Select xName, MAX(xDATETIME) AS MaxDateVal 
FROM $dbtable 
GROUP BY xName 
ORDER BY MaxDateVal 
+0

我試圖MAX xDATEIME,但它給了我表格的最新條目,而不是最新的每個獨特的xNAME – 2010-03-11 21:55:30

+0

你試過提供的查詢?還使用** GROUP BY **? – 2010-03-11 21:58:00

+1

是的,如果我把這個查詢放在裏面,我所得到的就是名字,並且這些名字沒有按照輸入時間排序。 – 2010-03-11 22:09:05

3
SELECT xNAME, MAX(xDATETIME) 
FROM $dbTable 
GROUP BY xNAME 
ORDER BY xDATETIME DESC 
+1

我不認爲在這裏需要ORDER BY,只是引擎X的額外步驟) – 2010-03-11 21:39:35

+0

+1同意,只是複製他的查詢。但如果他想要它的名單,那麼它會工作。 – 2010-03-11 21:43:57

+0

提供的結果似乎並沒有訂購什麼,所以所有...再次檢查 – 2010-03-11 21:48:15

0
SELECT MAX(xNAME), MAX(xDATETIME) FROM $dbTable GROUP BY xNAME ORDER BY xDATETIME DESC 
+1

MAX(xNAME)'?我不認爲你可以在你在GROUP BY中指定的列上調用MAX。 – Powerlord 2010-03-11 21:40:25

+0

** MAX(xName)?**你確定。這將只返回一行... – 2010-03-11 21:41:03

+0

它應該每組返回一行,就像MAX(xDATETIME)一樣。可能沒有必要。 – 2010-03-11 21:42:19

2

與您的查詢的問題是,當您使用GROUP BY時,您必須爲不在GROUP BY子句中的字段指定聚合函數。

你可能想嘗試,而不是以下:

SELECT  u.* 
FROM  users u 
INNER JOIN (
      SELECT xName, MAX(xDatetime) max_time 
      FROM  users 
      GROUP BY xName 
      ) sub_u ON (sub_u.xName = u.xName AND 
         u.xDateTime = sub_u.max_time); 

上面的查詢可以測試如下:

CREATE TABLE users (id int, xName varchar(100), xDateTime datetime); 

INSERT INTO users VALUES (1, 'a', '2010-03-11 00:00:00'); 
INSERT INTO users VALUES (2, 'a', '2010-03-11 01:00:00'); 
INSERT INTO users VALUES (3, 'a', '2010-03-11 02:00:00'); 
INSERT INTO users VALUES (4, 'b', '2010-03-11 01:00:00'); 
INSERT INTO users VALUES (5, 'b', '2010-03-11 02:00:00'); 
INSERT INTO users VALUES (6, 'b', '2010-03-11 03:00:00'); 
INSERT INTO users VALUES (7, 'c', '2010-03-11 06:00:00'); 
INSERT INTO users VALUES (8, 'c', '2010-03-11 05:00:00'); 

-- Query Result: 

+----+-------+---------------------+ 
| id | xName | xDateTime   | 
+----+-------+---------------------+ 
| 3 | a  | 2010-03-11 02:00:00 | 
| 6 | b  | 2010-03-11 03:00:00 | 
| 7 | c  | 2010-03-11 06:00:00 | 
+----+-------+---------------------+ 

如果您想訂購由max_time場的結果集,只需在查詢結尾添加ORDER BY u.xDateTime DESC即可。你

+1

雖然我沒有嘗試下面的所有回覆,但是這個迴應是透明的。謝謝! – 2010-03-11 22:35:45

0

還可以這樣做:

Select 
    xName, xDATETIME 
from 
    $dbTable t1 
where 
    xDATETIME = 
    (select max(xDATETIME) from $dbTable t2 
    where t1.xName=t2.xName) 
order by xDATETIME DESC