mysql 5.7关于group by显示多列的一个潜坑
最近在看sql的相关知识,看完了michael-chen的关于mysql的详细介绍并做了一些练习题后,茅塞顿开,以前上学惶恐的什么内连接,左连接,右连接完全都不在话下,底气倍增。然而,后续一个看起来非常普通的多表查询,就让我整个大脑发热,濒临down机,回顾这个问题,主要还是固化思维惹的祸,解决问题方向没抓对并且没有及时调节方向。so, 重点,敲黑板,遇到错误初步分析没有结果后,请立刻,马上原贴转向互联网!!!
问题描述:有两张表,dept和employee,他们通过外键dept_id关联起来。题目要求前台页面查看每个部门有多少人,并展示 部门ID,部门名称,及部门人数这三个字段
看到这个题的时候,第一反应多表查询内连接并分组,没毛病,但是怎么又用group by又显示多列呢。我看到的例子都是只显示一个字段就是分组字段的啊,因为要分组统计。嗯 脑壳热。。。不管三七二十一,写个sql跑一下看看,果然出错。
语句:select dept.dept_no, dept.dept_name, count(staff_no) as number from dept inner join staff where dept.dept_no = staff.dept_no group by dept.dept_no;
报错:ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ashtest.dept.dept_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
看吧,这提示明里暗里就是在说group by不能显示多列嘛
好了,是不是group by有其他我不知道的用法,百度下group by怎么显示多列,如下图,发现问问题的人还不少
打开一两个看看,妈呀,吓死,都在鄙视题主。好尴尬。。。
走到这里,有点小绝望,又打开michael老师的博客园读了一遍,凄凉了,显示多列除了聚合函数,加分组的列,并没有多余的列啊,一定是我不够专业,我陷在深深的自我怀疑中,脑袋发热,跟cpu一样嗡嗡嗡,好像下一秒就会crash一样。
想找个DB专家问下,扫视一遍,咩有,翻翻通讯录,没有。呃,我好难过。。
把这个问题给我同事看,她写了跟我一样的语句,并且告诉我,跑过了,跑过了!瓦特?!我跟她说,不行,会出错,她说不可能,她都跑过了,呃。。忽然间,忽然间,什么东西好像冒出来。。我们用的是一样的mysql么??
终于在这个时候,我把报的错往百度上一贴,妈呀,果然,mysql 5.7升级后的问题,然而,本人我用的就是5.7。具体的解决办法已经不重要了,百度一搜一大把,一开始方向就走错了,花了再多的时间也不济于事,谨以此文纪念那颗曾经发热到要crash的大脑。
解决办法请参考: http://www.520sz.com/mysql-5-7-10-group-by-error.html
对了,跑完SET sql_mode = '';后,给点时间server生效,马上去跑也还会报错,大概3分钟后,上面的查询语句就可以跑通了。