天天看點

不會SQL的孩子傷不起啊...

檢視原文:​​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.一個字段函數,此函數生成一個值,該值彙總組中的記錄;