一般來說having常常搭配group by一起使用
現在有個情境是「取得文章分類的流覽次數超過5且依照次數由高到低排序」
若是一個初學SQL的新手又不認識having的用法,可能會寫成這樣:
SELECT category_id, SUM(view_cnt) AS view_cnt FROM `articles` WHERE view_cnt > 5; GROUP BY category_id ORDER BY view_cnt DESC
乍看之下好像是對的,但其實這個SQL變成「取得文章流覽次數超過5的文章分類流覽次數並依照次數由高到低排序」,這是因為WHERE會套用在GROUP BY之前,所以在GROUP BY前會把文章瀏覽次數小於5的排除掉才進行GROUP BY,這個結果不是我們要的!
正確的SQL是利用GROUP BY搭配HAVING
SELECT category_id, SUM(view_cnt) AS total_view_cnt FROM `articles` GROUP BY category_id HAVING total_view_cnt > 5 ORDER BY total_view_cnt DESC
如果不想使用HAVING的話也可以利用子查詢的方式,但比較不建議
SELECT * FROM ( SELECT category_id, SUM(view_cnt) AS total_view_cnt FROM `articles` GROUP BY category_id ORDER BY total_view_cnt DESC ) A WHERE A.total_view_cnt > 5;
因為查兩次,多此一舉