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

关于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条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)