我對正確的查詢有一些疑問,希望您能幫助我。我的測試表結構如下:SQL - 通過其他表中的值對項目進行排序的正確查詢
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
) ;
CREATE TABLE IF NOT EXISTS `user_throws` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`length` int(11) DEFAULT NULL,
PRIMARY KEY (`id`,`user_id`),
) ;
它們之間的關係是多對一(一個用戶可以有很多罰球)。事情是我需要爲所有用戶創造一個類似排名的頁面,比如說排名前100的投手。所以我需要一個查詢結果爲:
- 由用戶篩選,所以只有有任何投擲和投擲長度大於0的用戶是正確的記錄。
- 按重複過濾,因此只有唯一的用戶出現在列表中(GROUP BY我想)。
- 按投擲長度排序,因此只會追加最好(最大)的結果。
爲此我寫的查詢:
SELECT `user_throws`.`length` , `users` . *
FROM `users`
JOIN `user_throws` ON ( `user_throws`.`user_id` = `users`.`id`)
WHERE `user_throws`.`length` > '0'
GROUP BY `users`.`id`
ORDER BY `user_throws`.`length` DESC
但問題是結果不是由最長投射排序。它過濾長度大於0的拋出並顯示唯一的用戶,但附加的長度不符合所需的排序。我發現length
的價值是最低價投擲user_throws
。與用戶關聯的id
。正確的查詢應該如何?
該理論很好,但這不會完全奏效,因爲除非您還有GROUP BY這些字段,否則您不能選擇帶有MAX聚合子句的u。*。如果你調整它應該工作的語法。 – 2010-09-17 16:09:32
實際上,也許不幸的是,這在MySQL中執行得很好......這些怪癖之一;) – Rudu 2010-09-17 16:10:53
這是真的MAX()將做最大的結果選擇,但不會以最長的投擲長度排序用戶。所以這不完全是我正在尋找的。不管怎麼說,還是要謝謝你。 – 2010-09-17 16:32:29