2009-07-16 36 views
0

長話短說,我應該在GROUP BY子句之後放置哪些字段?在MySQL GROUP BY子句中放置哪些列

SELECT questions.question_id, questions.title, questions.content, questions.view_count, questions.posted_on, users.user_id, users.group_id, users.username, users.first_name, users.last_name COUNT(answers.answer_id) AS answer_count 
FROM (questions) 
JOIN answers ON questions.question_id = answers.question_id 
JOIN users ON questions.user_id = users.user_id 
WHERE `questions`.`publish` = 'Y' AND `questions`.`deleted_at` IS NULL AND `users`.`blocked` = 'N' 
GROUP BY questions.question_id 

我應該把每個非聚合字段中提到的選擇,或者只是其中之一是好的? (例如,只是question_id)我很困惑,因爲無論哪種方式,結果都是一樣的。有什麼不同 ?

在網絡上的教程似乎都給出了一個只使用兩個字段的例子,一個聚合字段和一個普通字段。

更新:好吧,它看起來像我必須把他們都得到一個準確的結果。這引出了其他問題:準確度有多準確?難道不是很好嗎?對性能的影響如何?

回答

1

「你需要把所有的非agregated列準確的結果」

第二個選項的例子

的確如此,但是我想補充一點,你把所有的列按你想要的順序進行分組(這對你很重要?)。

編輯:準確意味着如果你不這樣做,你的查詢就會崩潰。關於表演,GROUP BY中的字段越多,表演越少,但這並不意外

1

您需要放置所有非聚合列才能獲得準確的結果。

+0

準確度有多準確?難道不是很好嗎?對性能的影響如何? – andyk 2009-07-16 09:12:46

0

你必須做: GROUP BY questions.question_id,questions.title,questions.content,questions.view_count,questions.posted_on,users.user_id,users.group_id,users.username,users.first_name,users.last_name

(即所有的人)

ü可以有另一種內連接的數量,使得你剛剛要做一個。

編輯:這裏是(沒有測試,但應該工作)

SELECT questions.question_id, questions.title, questions.content, questions.view_count, questions.posted_on, users.user_id, users.group_id, users.username, users.first_name, users.last_name, r.AN_ANSWER_COUNT 
FROM (questions q) 
JOIN answers ON questions.question_id = answers.question_id JOIN users ON questions.user_id = users.user_id 

left join (SELECT question_id, COUNT(a.answer_id) AS AN_ANSWER_COUNT 
        FROM answers a 

        WHERE (your_condition) 
        GROUP BY question_id)r 
      on q.question_id = a.question_id 

WHERE `questions`.`publish` = 'Y' AND `questions`.`deleted_at` IS NULL AND `users`.`blocked` = 'N' 
+0

你會介意更多的關於內部連接的選擇嗎? – andyk 2009-07-16 09:22:53

1

MySQL收到這兩個選項,其他數據庫則沒有。 其他數據庫(hsqldb,Oracle)將強制您將GROUP BY子句中選定的所有字段。 當將GROUP BY子句後面的所有列放在一起時,結果通常不太明確。 MySQL「解釋」你的查詢爲:

SELECT questions.question_id, FIRST_VALUE(questions.title), FIRST_VALUE(questions.content), FIRST_VALUE(questions.view_count), FIRST_VALUE(questions.posted_on), FIRST_VALUE(users.user_id), FIRST_VALUE(users.group_id), FIRST_VALUE(users.username), FIRST_VALUE(users.first_name), FIRST_VALUE(users.last_name) COUNT(answers.answer_id) AS answer_count 
FROM (questions) 
JOIN answers ON questions.question_id = answers.question_id 
JOIN users ON questions.user_id = users.user_id 
WHERE `questions`.`publish` = 'Y' AND `questions`.`deleted_at` IS NULL AND `users`.`blocked` = 'N' 
GROUP BY questions.question_id 

這就是說如果MySQL有一個「FIRST_VALUE」函數。

由於您按唯一標識符(questions.question_id)進行分組,因此結果相同。 如果用非唯一標識符進行分組,則返回值非常不明確。

我不知道的唯一的事情是,如果根據單個字段進行組更有效。我的猜測是數據庫足夠聰明,可以理解您正在使用唯一標識符進行分組,並據此計劃執行,但我不確定。

如果效率沒有差別 - 您應該將所有字段放在GROUP BY之後,因爲它更標準。否則,決定是否優先編寫標準SQL來編寫高效的SQL。