规则:
第一,凡是在group by后面出现的字段,必须同时在select后面出现;
第二,凡是在select后面出现的、同时未在聚合函数中出现的字段,必须同时出现在group by后面.
第一和第二条规则任何一条不满足,则默认去分组的第一条记录显示
having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。
重点内容
如果想对于group by内部进行排序,例如下面这种情形:
CREATE TABLE info
(
info_id
int NOT NULL AUTO_INCREMENT,
content
int DEFAULT 0 NOT NULL,
update_time
datetime DEFAULT 0 NOT NULL
)
这里每一个info_id对应着多个content,好比我们的论坛一样,每一个帖子,对应着多个评论
如果我们想取最新的那条评论有如下两种方式
第一种:
先对表中的内容按照update_time进行降序排序,然后再按照上面的规则,默认取分组中的第一条记录(因为content和update_time未出现在group by 后面);如下:
select
info_id , content , update_time
from
(select * from info order by update_time desc) as i
group by i.info_id
第二种:
先把所有需要的字段整体当做一个分组,再利用having语句对于分组进行刷选,选出当前info_id下,最大的update_time的那条记录
select
i1.info_id , i1.content, i1.update_time
from
info i1
group by
i1.info_id
having
i1.update_time =
(select max(update_time) from info i2 where i2.info_id = i1.info_id )
这样即可,大家如果还有什么好的建议记得告诉我。