可能大家都遇到过。
我想取某个相同字段的最新的一条记录,比如:
name created_at
abc 20081012
def 20081112
abc 20081013
我想要返回
name created_at
abc 20081013
def 20081112
想到了group by但是得到的结果是
name created_at
abc 20081012
def 20081112
如何让group by里面被group的item也排序?
[b]问题补充:[/b]
order by 不行。order by只能对group 后的次序进行排序。
wangxuliangboy的方法可以,但是我可能没有说清楚我的需求,不好意思。
我需要的这个字段是没有max的。还是上面的例子的话:
name body created_at
abc body1 20081012
def body2 20081112
abc body3 20081013
我需要返回:
name body created_at
def body2 20081112
abc body3 20081013
而不是:
name body created_at
def body2 20081112
abc body1 20081012
虽然这两个都是order by created_at DESC的。所以aidiyuxin同学的方法不行。
[b]问题补充:[/b]
max(body)不行。我要的是max(created_at)对应的body而不是max(body)
[b]问题补充:[/b]
可能大家都遇到过。
我想取某个相同字段的最新的一条记录,比如:
name created_at
abc 20081012
def 20081112
abc 20081013
我想要返回
name created_at
abc 20081013
def 20081112
想到了group by但是得到的结果是
name created_at
abc 20081012
def 20081112
如何让group by里面被group的item也排序?
[b]问题补充:[/b]
order by 不行。order by只能对group 后的次序进行排序。
wangxuliangboy的方法可以,但是我可能没有说清楚我的需求,不好意思。
我需要的这个字段是没有max的。还是上面的例子的话:
name body created_at
abc body1 20081012
def body2 20081112
abc body3 20081013
我需要返回:
name body created_at
def body2 20081112
abc body3 20081013
而不是:
name body created_at
def body2 20081112
abc body1 20081012
虽然这两个都是order by created_at DESC的。所以aidiyuxin同学的方法不行。
[b]问题补充:[/b]
max(body)不行。我要的是max(created_at)对应的body而不是max(body)
to foxgst:
我用的是Mysql, 你的方法不行。已下的语句是我用的:
[code="Sql"]SELECT msg.id, msg.body, max(msg.created_at) FROM shoofr_test.message_recipients m LEFT OUTER JOIN shoofr_test.messages msg ON msg.id = m.message_id group by msg.subject order by msg.id DESC[/code]
选出来的确实是max(created_at)但是其对应的不是自己的body, 而还是msg.id最小的那个对应的id. 所以order by msg.id只对gruop后的结果有效而group和max会产生错位的奇怪现象 ;)
举例和需求差太多。
看你的意思,好像是
在message中选择出来排序的记录号,必须是message_recipients在message_id值的范围内,
如果是这样,那么分两步走,一是检索出满足条件的记录的subject和created_at值,然后使用这个值作为索引检索满足需求的所有记录,这么写
[code="sql"]
select * from (SELECT max(msg.created_at) as created_at, msg.subject FROM shoofr_test.messages msg where msg.id in (select m.message_id from shoofr_test.message_recipients m) group by msg.subject) t1, shoofr_test.messages t2 where t1.created_at = t2.created_at and t1.subject = t2.subject order by id DESC
[/code]
或者
[code="sql"]
select * from (SELECT max(msg.created_at) as created_at, msg.subject FROM shoofr_test.message_recipients m LEFT OUTER JOIN shoofr_test.messages msg ON msg.id = m.message_id group by msg.subject) t1, shoofr_test.messages t2 where t1.created_at = t2.created_at and t1.subject = t2.subject order by id DESC
[/code]
可以嵌套两次查询,也可以join两次。
用orderby啊
[code="sql"]SELECT * FORM xxx GROUP BY created_at ORDER BY created_at[/code]
SELECT name ,max(created_at) FORM xxx GROUP BY name
SELECT name,max(created_at) FORM xxx GROUP BY name
因为不能用group by name,body
SELECT name,max(body),max(created_at) FORM xxx GROUP BY name
这样写应该是行的..我没调试.但不是一种好方法..
你加我MSN吧..wangxuliangboy@hotmail.com
oralce下可以用row_numnber函数解决这个问题
[code="sql"]
SELECT X.*
(
SELECT A.*
, ROW_NUMBER() OVER(ORDER BY A.CREATED_AT DESC) AS ROW_NO
FROM XXX A
) X
WHERE X.ROW_NO = 1
[/code]
哦,上面的还有一点问题,应该按照NAME进行分组后再排序
[code="sql"]
SELECT X.*
(
SELECT A.*
, ROW_NUMBER() OVER(PARTITION BY A.NAME ORDER BY A.CREATED_AT DESC) AS ROW_NO
FROM XXX A
) X
WHERE X.ROW_NO = 1
[/code]
查看Group和Max组合的用法。
[code="sql"]select id, name, max(created_at) from stu group by name order by id[/code]
既然是MYSQL
只好用笨办法了
[code="SQL"]
SELECT A.*
FROM XXX A
INNER JOIN
(
SELECT NAME, MAX(CREATED_AT) MAX_CREATED_AT
FROM XXX
GROUP BY NAME
) B ON
A.NAME = B.NAME
AND A.CREATED_AT = B.MAX_CREATED_AT
[/code]
这个SQL可能会有性能问题