2010-09-13 43 views
1

如果已经发布或在互联网上发布了对不起,我很抱歉。我来这里是漫长的寻找之后按列修改组以获得最新结果

假设是这样的表:

+----+-------+----------+---------------------+ 
| id | name | group_id | created_time  | 
+----+-------+----------+---------------------+ 
| 1 | foo | 1  | 2010-09-22 00:00:00 | 
| 2 | rafi | 2  | 2010-09-23 00:00:00 | 
| 3 | rafi1 | 2  | 2010-09-24 00:00:00 | 
| 4 | rafi2 | 2  | 2010-09-25 00:00:00 | 
| 5 | bar | 5  | 2010-09-26 00:00:00 | 
| 6 | baz | 6  | 2010-09-27 00:00:00 | 
| 7 | baz1 | 6  | 2010-09-26 00:00:00 | 
| 8 | rafi3 | 2  | 2010-09-24 00:00:00 | 
| 9 | baz2 | 6  | 2010-09-30 00:00:00 | 
+----+-------+----------+---------------------+ 

我想要的是一群这些根据组ID,并责令由CREATED_TIME递减(更新的版本)

但是当我说

SELECT id,name,group_id,created_time FROM test group by group_id ORDER BY id desc; 

我得到这个

+----+------+----------+---------------------+ 
| id | name | group_id | created_time  | 
+----+------+----------+---------------------+ 
| 6 | baz | 6  | 2010-09-27 00:00:00 | 
| 5 | bar | 5  | 2010-09-26 00:00:00 | 
| 2 | rafi | 2  | 2010-09-23 00:00:00 | 
| 1 | foo | 1  | 2010-09-22 00:00:00 | 
+----+------+----------+---------------------+ 

我想要的是得到这样的

+----+------+----------+---------------------+ 
| id | name | group_id | created_time  | 
+----+------+----------+---------------------+ 
| 9 | baz2 | 6  | 2010-09-30 00:00:00 | 
| 5 | bar | 5  | 2010-09-26 00:00:00 | 
| 5 | rafi2| 2  | 2010-09-25 00:00:00 | 
| 1 | foo | 1  | 2010-09-22 00:00:00 | 
+----+------+----------+---------------------+ 

我已经试过

SELECT max(date(created_time)) as foo,name,group_id FROM test group by group_id ORDER BY foo desc; 

我得到的日期正确的,但不能得到的姓名权。

回答

1

这个怎么样?是使用子查询的一个选项 - 如果是的话,这可能工作!

SELECT id, name, group_id WHERE id IN (Select max(id) FROM test group by group_id) ORDER BY id desc;

+0

这是更好的..因为内部连接工作太慢,即使索引后......虽然我做了一个更快的做法是把它分成2个查询......现在它快得多 – Rafi 2010-09-14 17:58:56

2

这是否查询符合您的需求?

SELECT t1.id, t1.name, t1.group_id FROM Test t1 
INNER JOIN 
    (SELECT MAX(id) as maxid FROM Test GROUP BY group_id) t2 
ON t2.maxid = t1.id 
ORDER BY t1.id DESC; 

编辑:,如果你想通过一个时间字段来命令你可以稍微修改上面的查询

SELECT t1.id, t1.name, t1.group_id, t1.created_date FROM Test t1 
INNER JOIN 
    (SELECT MAX(created_date) as maxdate, group_id FROM Test GROUP BY group_id) t2 
ON (t2.maxdate = t1.created_date AND t2.group_id = t1.group_id) 
ORDER BY t1.created_date DESC; 

难道还要你在找什么?

+0

看起来对我好。顺序应该desc虽然。 (仍然+1;)) – Shadwell 2010-09-13 16:08:37

+0

ARF对不起:)我编辑并修复, – PierrOz 2010-09-13 16:13:01

+0

问题是,这个数据是虚拟的...我想命令的日期时间字段(created_time),这可能会从ID不同...对不起困惑..我会编辑它 – Rafi 2010-09-13 16:32:43