请教一个mysql的分组排序问题

啊啊啊aaaaa 2015-09-01 05:45:59
tab表如下:
id pubid userid uid msgText msgTime
1 4 1 3 ddd 2015
2 4 3 1 eee 2015
3 3 1 2 abc 2015
4 3 1 2 aaa 2015
5 3 2 1 bbb 2015
6 3 2 1 aaa 2015
7 3 2 1 uuu 2015
8 5 1 4 ooo 2015
9 5 1 4 qaq 2015
已知传递来的一个变量为1。
我希望条件为userid=1 or uid=1
并且以pubid进行分组
排序以id来desc
得出的结果应该为下面这3条
id pubid userid uid msgText msgTime
9 5 1 4 qaq 2015
7 3 2 1 uuu 2015
2 4 3 1 eee 2015
目前我写的sql为:
select max(id) id,msgText,msgTime from tab where userid='1' or uid='1' group by pubid order by id desc
但好像不对 虽然id是对的 但msgText,msgTime不是对应的,有可能会变成:
9 5 1 4 ooo 2015
按理说我要的是
9 5 1 4 qaq 2015
忘大神写一个正确的mysql查询 感激不尽!
...全文
572 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hovertiger 2015-09-03
  • 打赏
  • 举报
回复
很好,值得借鉴。
道玄希言 2015-09-02
  • 打赏
  • 举报
回复
标准SQL的GROUP BY 一定要结合聚合函数,而且选择的字段除了聚合函数外,还必须在group by中出现,否则报错。 但是在mysql中扩展了这样的功能, 它可以將未经聚合的选择字段不出现在group by中。 对于不加聚合函数的sql来说,它的功能结合了limit来得出结果。 limit的时候得到的并不是 最大最小的值,而是某一下group by结果集中第一行,也就是相当于先group by, 然后在每个group by下面进行limit 1。 所以你举例中, msgText 不是 ID 为 9 的纪录中的 qaq, 而是 ID为 8 的纪录中的 ooo 因为虽然你分组时,聚合ID取最大值 9, 但是, msgText 没有聚合, 所以,在group by 组中的第一条纪录, 其实是 8 5 1 4 ooo 2015 so , 取到的msgText 值就是 ooo 了。
道玄希言 2015-09-02
  • 打赏
  • 举报
回复


SELECT 
  t1.id, t1.pubid, t2.userid, t2.uid,
  t2.msgText, t2.msgTime
FROM
(
  SELECT 
  MAX(id) AS id, pubid
  FROM   tab
  WHERE  userid=1 OR uid=1
  GROUP BY pubid
) AS t1
LEFT JOIN   tab  AS t2
ON t1.id = t2.id AND t1.pubid =t2.pubid
ORDER BY id DESC

  • 打赏
  • 举报
回复
select * from tab where id in (select max(id) from tab where userid='1' or uid='1' GROUP BY pubid ) ORDER BY id DESC;
ACMAIN_CHM 2015-09-02
  • 打赏
  • 举报
回复
参考下贴中的多种方法 http://blog.csdn.net/acmain_chm/article/details/4126306 [征集]分组取最大N条记录方法征集,及散分....
道玄希言 2015-09-02
  • 打赏
  • 举报
回复
引用 4 楼 u011575570 的回复:
是这样的,只聚合ID没有聚合msgText ,还要多学习[/quote] 相互学习~ 如果是MSSQL就不会出现这情况了。 group by 在MYSQL里面, 被扩展了。 这也对部分字段值沒要求的分组,提供了很多方便。
rick-he 2015-09-02
  • 打赏
  • 举报
回复
引用 3 楼 yangb0803 的回复:
标准SQL的GROUP BY 一定要结合聚合函数,而且选择的字段除了聚合函数外,还必须在group by中出现,否则报错。 但是在mysql中扩展了这样的功能, 它可以將未经聚合的选择字段不出现在group by中。 对于不加聚合函数的sql来说,它的功能结合了limit来得出结果。 limit的时候得到的并不是 最大最小的值,而是某一下group by结果集中第一行,也就是相当于先group by, 然后在每个group by下面进行limit 1。 所以你举例中, msgText 不是 ID 为 9 的纪录中的 qaq, 而是 ID为 8 的纪录中的 ooo 因为虽然你分组时,聚合ID取最大值 9, 但是, msgText 没有聚合, 所以,在group by 组中的第一条纪录, 其实是 8 5 1 4 ooo 2015 so , 取到的msgText 值就是 ooo 了。
是这样的,只聚合ID没有聚合msgText ,还要多学习
rick-he 2015-09-01
  • 打赏
  • 举报
回复
select max(id) id,msgText,msgTime from tab where userid='1' or uid='1' group by pubid order by id desc 你直接取最大的id为什么还要order by id desc,感觉没什么不对。你试下加括号 select max(id) id,msgText,msgTime from tab where (userid='1' or uid='1' ) group by pubid order by id desc

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧