2009-11-14 95 views
0
$query = "SELECT posts.* 
    FROM map, posts, tags 
    WHERE map.tag_id = tags.id 
    AND (tags.name IN ('mysql', 'database')) 
    AND map.post_id = posts.id 
    GROUP BY posts.id 
    HAVING COUNT(posts.id) = 2"; 

我不明白最後一行。有人可以爲我解釋嗎?如果我沒有在那裏有什麼區別?幫我理解這個MySQL代碼

+0

選擇*當你使用GROUP BY也是壞的風格,因爲它不會在大多數DBMS編譯,不會對MySQL的 – Dmitry 2009-11-14 00:59:40

+1

任何預測的行爲BTW,現在當你問了幾個問題並得到答案,您可能需要將其中的一些標記爲「回答」您的問題(如果其中有任何問題) – Dmitry 2009-11-14 01:02:03

+0

另外:'SELECT posts。*'是可以接受的,因爲'GROUP'在'posts.id '。假設這是主鍵,那麼''.post。*''在功能上依賴於'組列中的所有其他列。當您嘗試選擇在GROUPing列中沒有功能依賴關係的未聚合列時,只會在ANSI SQL中出現錯誤。你可能仍然認爲任何舊的SELECT *都可能是不好的風格,但這是另一回事...... – bobince 2009-11-14 03:24:22

回答

5

最後一行表示您只留下那些具有完全2個後ID的組。如果你刪除它,所有組將被選中。

+0

請不要改變你的問題,這樣它就會變得完全不同 – Dmitry 2009-11-14 00:55:20

0

「HAVING」謂詞充當過濾器,它只選擇具有兩(2)個相同post.id的行。

它看起來像查詢查找具有重複ID的行。

HAVING COUNT(posts.id) > 1 

可能會更好,爲此目的。

0

從文檔:

HAVING子句應用於幾乎最後,只是在項目被髮送到客戶端,沒有優化。 (LIMIT是在HAVING之後應用的)。

所以where子句被應用,然後分組,然後擁有..可以應用到您的分組之後通過累計的值彙總了所有聚合,例如SUM或MAX。

http://dev.mysql.com/doc/refman/5.1/en/select.html