2014-03-01 92 views
0

說,如果我有一個類似的表,但包括更多列和更多的行(這些都是相關的唯一因素):在MySQL選擇每個結果的最新的一個

+-------+----+ 
| name | id | 
+-------+----+ 
| james | 1 | 
| james | 2 | 
| james | 3 | 
| adam | 4 | 
| max | 5 | 
| adam | 6 | 
| max | 7 | 
| adam | 8 | 
+-------+----+ 

我怎麼能拿這麼它只會顯示來自max(id)每個name,如:

+-------+----+ 
| name | id | 
+-------+----+ 
| adam | 8 | 
| max | 7 | 
| james | 3 | 
+-------+----+ 

我現在只是有這個

"select * from table order by id desc" 

但這只是顯示最新的ID。我只想看到每個名字中的一個。


所以基本上只顯示每個name

+0

@toxalot不需要很長時間嗎?! – maxisme

+0

真的不需要太多時間,使問題更容易閱讀。 – toxalot

+0

根據您的意見戈登Linoff的答案,你應該閱讀http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column – toxalot

回答

3

你會使用最高id聚集和max()

select name, max(id) 
from table t 
group by name 
order by max(id) desc 
limit 40; 

編輯:

如果需要select *最高id,然後使用not exists的方法:

select * 
from table t 
where not exists (select 1 from table t2 where t2.name = t.name and t2.id > t.id) 
order by id desc 
limit 40; 

「不存在」本質上是這樣說的:「讓我所有的表中沒有其他行具有相同的名稱和更高的ID」的表中的所有行。這是獲得最大行數的一種循環方式。實現這一

+0

我試過這個' 「select name,max(id),comunicate,session_number,date from social group by name order by max(id)desc limit 40;」'但是這個選擇最早的id – maxisme

+2

@Maximilian。 。 。如果你有更多的專欄,你應該提出另一個問題,提供適當的數據和你想要的結果。這個問題與你問的不同。 –

0

一種方法是利用一個非標準GROUP BY擴展在MySQL

SELECT * 
    FROM 
(
    SELECT * 
    FROM table1 
    ORDER BY id DESC 
) q 
GROUP BY name 
-- LIMIT 40 

或另一種方式是先抓住每名最大ID,然後加入回你的表來獲取所有其他列

SELECT t.* 
    FROM 
(
    SELECT MAX(id) id 
    FROM table1 
    GROUP BY name 
    -- LIMIT 40 
) q JOIN table1 t 
    ON q.id = t.id 
ORDER BY name; 

輸出:

 
| NAME | ID | 
|-------|----| 
| adam | 8 | 
| james | 3 | 
| max | 7 | 

這裏是SQLFiddle演示

+0

OP要按'id'而不是'name'降序排列。 – toxalot

+0

即使MySQL支持它,我也不會推薦第一個查詢。爲未在GROUP BY表達式中命名的非聚合列返回的值是不確定的。雖然從有序的子查詢中選擇似乎可以解決這個問題,但我不想依賴這種行爲。 – toxalot

相關問題