2010-11-04 50 views
0

考慮下面的查詢:選擇這導致對GROUP返回由

SELECT domain, done FROM tasks WHERE 1 GROUP BY domain 

很明顯,我可以得到它與MAX(完成)返回「完成」的最大值,但我如何得到它返回整行?

在我的情況,我有以下行的表:

domain = somedomain.com, done = 12:27:39, somecolumn = pink 
domain = somedomain.com, done = 13:27:39, somecolumn = blue 
domain = somedomain.com, done = 14:27:39, somecolumn = orange 
domain = anotherdomain.com, done = 07:27:39, somecolumn = orange 
domain = anotherdomain.com, done = 09:27:39, somecolumn = pie 

使用上面的查詢時,它返回以下2行:

domain = somedomain.com, done = 13:27:39, somecolumn = blue 
domain = anotherdomain.com, done = 09:27:39, somecolumn = pie 

我需要返回這2行:

domain = somedomain.com, done = 14:27:39, somecolumn = blue 
domain = anotherdomain.com, done = 09:27:39, somecolumn = pie 

感謝幫助:)。

+0

哎呀,顯然我不是很清楚。我的表格包含各種域,全部都有多個條目。我想返回每個域的最新行。我更新了原始問題以更好地解釋我想要做的事情。 – 2010-11-05 09:12:19

回答

4

最簡單的一個:

SELECT done,somecolumn FROM tasks ORDER BY done DESC LIMIT 1; 

更爲精細的查詢,左連接或可能需要子查詢,但是這一次是相當直截了當。


對於它的赫克,如果你確實需要的其他數據:

(1)NOT EXISTS:

SELECT a.* 
FROM tasks a 
WHERE NOT EXISTS(
    SELECT * FROM tasks b 
    WHERE b.domain = a.domain AND b.done > a.done); 

(2)LEFT JOIN

SELECT a.* 
FROM tasks a 
LEFT JOIN tasks b 
ON b.domain = a.domain AND b.done > a.done 
WHERE b.id IS NULL; 

( 3)ROWNUMBER()如:

SELECT numbered.* 
FROM (
    SELECT 
     @row := IF(@old_domain = domain,@row + 1,1) as rownumber, 
     @old_domain := domain as domain, 
     done, 
     somecolumn 
    FROM tasks 
    JOIN (SELECT @old_domain:=0,@row:=0) void 
    ORDER BY domain ASC, done DESC 
) numbered 
WHERE numbered.rownumber = 1; 

哪一個會給你更好的表現很大程度上取決於數據集,所以我只是測試這些。

+0

感謝您的回覆,顯然我的解釋不是很清楚,我已經更新:) – 2010-11-05 09:15:39

+0

看到我在 – Wrikken 2010-11-05 09:25:09

+0

編輯的3個備選方案感謝Wrikken,不幸的是,上面的所有3個示例都返回了我的所有5個測試行 – 2010-11-05 09:40:26

1
SELECT * FROM tasks WHERE done = (SELECT Max(done) FROM tasks) 
+0

感謝您的回覆,顯然我的解釋不是很清楚,我已經更新上面:) – 2010-11-05 09:21:19

1
select 
    * 
from 
    tasks 
where 
    `done`=(select max(`done`) from tasks) 
+0

感謝您的回覆,顯然我的解釋不是很清楚,我已經更新上面:) – 2010-11-05 09:19:17