Mysql group by 排序问题

 类如 有一个
帖子的回复表,posts( id , tid , subject , message ,  dateline ) ,

mysql分组命令是GROUP BY,下面我把在学习GROUP
BY命令时笔记与大家分享,这里包括了GROUP BY简单用法与GROUP BY排序问题了。

id 为 自动增长字段, tid为该回复的主题帖子的id(外键关联),  subject
为回复标题, message 为回复内容, dateline 为回复时间,用UNIX
时间戳表示,

463.com,每当查询数据库时,想知道有多少类,或想知道找不相同的有多少种,就用到了分组语句group
by

现在要求 选出 前十个来自不同主题的最新回复

使用方法:

SELECT * FROM posts GROUP BY  tid  LIMIT 10

 代码如下

这样一个sql语句选出来的并非你想要的
最新的回复,而是最早的回复,实际上是某篇主题的第一条回复记录!

复制代码

也就是说 GROUP BY 语句没有排序,那么怎么才能让 GROUP 按照 dateline
倒序排列呢?加上 order by 子句?

SELECT * FROM `表名` group by `分组字段`

看下面:

或带limit做法

SELECT * FROM posts GROUP BY  tid 
ORDER BY dateline DESC LIMIT 10

 代码如下

这条语句选出来的结果和上面的完全一样,不过把结果倒序排列
了,而选择出来的每一条记录仍然是上面的记录,原因是 group by 会比 order
by 先执行,这样也就没有办法将 group by
之前,也就是在分组之前进行排序了, 有网友会写出下面的sql 语句:

复制代码

SELECT * FROM posts GROUP BY  tid DESC ORDER BY dateline DESC LIMIT
10

SELECT *
FROM `数据表`
GROUP BY `分组的字段`
LIMIT 0 , 30

也就是说 在 GROUP BY 的字段 tid
后面加上递减顺序,这样不就可以取得分组时的最后回复了吗?这个语句执行结果会和上面的一模一样,这里加上
DESC 和ASC对执行结果没有任何影响!其实这是一个错误的语句,原因是GROUP BY
之前并没有排序功能,mysql 手册上面说,GROUP BY
时是按照某种顺序排序的,某种顺序到底是什么顺序?其实根本没有顺序,因为按照tid分组,其实也就是说,把tid相等的归纳到一个组,这样想的
话,GROUP BY tid DESC 可以认为是在按照 tid
分组的时候,按照tid进行倒序排列,这不扯吗,既然是按照tid分组,当然是tid相等的归到一组,而这时候按照tid倒叙还是升序有个P用!

例:(查询dedecms(织梦)程序的栏目标题表,以栏目id分组)

于 是有网友发明下面的语句:

 代码如下

SELECT * FROM posts GROUP BY  tid , dateline DESC ORDER BY dateline
DESC LIMIT 10

复制代码

心 想这样我就可以在分组前按照  dateline
倒序排列了,其实这个语句并没有起到按照tid分组的作用,原因还是上面的,在group
by 字段后加 desc 还是 asc 是错误的写法,而这种写法 网友本意是想 按照 tid
分组,并且在分组的时候按照
dateline排倒序!而实际这句相当于下面的写法:(去掉 GROUP BY 字段后面的
DESC)

SELECT *
FROM `dede_archives`
GROUP BY `typeid`
LIMIT 0 , 30

SELECT * FROM posts GROUP BY  tid
, dateline ORDER BY dateline DESC LIMIT 10

关于mysql group by排序问题 .

也就是说,按照 tid 和 dateline 联合分组,只有在记录tid和dateline
同时相等的时候才归纳到一组,这显然不可能, 因为 dateline
时间线基本上是唯一的!

类如 有一个 帖子的回复表,posts( id , tid , subject , message , 
dateline ) ,

有人写出下面的语句:

id为 自动增长字段, tid为该回复的主题帖子的id(外键关联),  subject
为回复标题, message 为回复内容, dateline 为回复时间,用UNIX
时间戳表示,

SELECT *,max(dateline) as
max_line FROM posts GROUP BY  tid ORDER BY dateline DESC LIMIT
10

最简单的 :

这条语句的没错是选出了最大发布时间,但是你可 以对比一下 dateline 和
max_dateline
并不相等!(可能有相当的情况,就是分组的目标记录只有一条的时候!)

 代码如下

相关文章