iteye_11360
2008-11-03 06:44 阅读 177
已采纳

关于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 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两次。

    点赞 评论 复制链接分享
  • aidiyuxin aidiyuxin 2008-11-03 09:14

    用orderby啊
    [code="sql"]SELECT * FORM xxx GROUP BY created_at ORDER BY created_at[/code]

    点赞 评论 复制链接分享
  • nomoney_boy nomoney_boy 2008-11-03 11:04

    SELECT name ,max(created_at)  FORM xxx GROUP BY name

    点赞 评论 复制链接分享
  • nomoney_boy nomoney_boy 2008-11-03 16:52

    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

    这样写应该是行的..我没调试.但不是一种好方法..

    点赞 评论 复制链接分享
  • nomoney_boy nomoney_boy 2008-11-04 15:28
    点赞 评论 复制链接分享
  • weixin_42511021 т 2008-11-04 18:26

    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]

    点赞 评论 复制链接分享
  • weixin_42511021 т 2008-11-04 18:28

    哦,上面的还有一点问题,应该按照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]

    点赞 评论 复制链接分享
  • iteye_10592 iteye_10592 2008-11-10 08:49

    查看Group和Max组合的用法。

    [code="sql"]select id, name, max(created_at) from stu group by name order by id[/code]

    点赞 评论 复制链接分享
  • weixin_42511021 т 2008-11-11 09:45

    既然是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可能会有性能问题

    点赞 评论 复制链接分享

相关推荐