最近在看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分鍾后,上面的查詢語句就可以跑通了。