2014-03-01 52 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

相关问题