iteye_11360
2008-11-03 06:44
浏览 178
已采纳

关于sql语句的问题

可能大家都遇到过。

我想取某个相同字段的最新的一条记录,比如:
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会产生错位的奇怪现象 ;)

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

9条回答 默认 最新

  • iteye_10592 2008-11-11 09:33
    最佳回答

    举例和需求差太多。

    看你的意思,好像是
    在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两次。

    评论
    解决 无用
    打赏 举报
查看更多回答(8条)

相关推荐 更多相似问题