檢視原文:http://www.hellonet8.com/566.html
自從把DBMS從Mysql換成PostgreSQL後,章郎蟲在資料操作的時候老是會碰到問題。這不今天又碰到了一個很有意思的問題,弄了好久還是沒有解決。最後找了高手,回家又看了下書,然後個人簡單總結下和SQL童鞋們一起分享。不會SQL的孩子真的傷不起啊!
本來在Mysql中,使用以下sql語句不會出現任何問題:
注:這裡需要把資料庫稍微介紹下,match_code是根據title值計算出來的。
SELECT count(*) AS matchCount,a.title AS title,a.url AS url
FROM article_label al INNER JOIN article a ON al.aid=a.aid
WHERE al.lid=239 AND a.match_code IS NOT NULL AND a.tm_post BETWEEN '2011-07-17' AND '2011-09-17' AND a.style!=4
GROUP BY a.match_code
ORDER BY matchCount DESC
LIMIT 20 ;
但是使用PostgreSQL,還是上面這條sql,運作就碰到問題了。具體的錯誤提示資訊是這樣的:
Error: column "article.title" must appear in the GROUP BY clause or be used in an aggregate function。
看這個英文的意思就是需要将article.title這個字段加在group by的分組字段中。而如果你隻是單純的加上這個字段,運作後還是會報錯。隻是這個時候系統就提示你需要把article.url這個字段也加上。再加上後運作是正常了,但是得到的結果肯定是錯誤的了。
最後把上面這個sql修改成以下後就可以成功運作了:
SELECT count(*) AS matchCount,a.title AS title,max(a.url) AS url
FROM article_label al INNER JOIN article a ON al.aid=a.aid
WHERE al.lid=239 AND a.match_code IS NOT NULL AND a.tm_post BETWEEN '2011-07-17' AND '2011-09-17' AND a.style!=4
GROUP BY a.match_code,a.title
ORDER BY matchCount DESC
LIMIT 20 ;
因為match_code和title值成一一對應關系,是以可以簡單的将title字段作為第二個(備援的)分組字段。而title一樣的文章中url會存在差别,是以這裡随便選擇了max(url)。
分組查詢(GROUP BY)的限制:
以下是從書裡抄來的,感覺一直說的很模糊,哈哈。
1、分組字段必須是在查詢的FROM子句中命名的表的實際字段。對出現在分組查詢的選擇清單中的項也有一些限制,可以是:
a.一個字段(假設他是分組字段之一);
b.一個常量;
c.一個字段函數,此函數生成一個值,該值彙總組中的記錄;