我在正确查询时遇到了一点问题,希望您能帮助我。我的测试表结构如下:
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 名 throw 者。所以我需要一个查询结果是:
- 由用户过滤,只有有任何 throw 且 throw 长度大于 0 的用户才是正确记录。
- 按重复项过滤,因此只有唯一用户出现在列表中(我想是 GROUP BY)。
- 按 throw 长度排序,因此只会附加最好(最大)的结果。
为此,我编写了查询:
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
但问题是结果没有按最长 throw 排序。它过滤长度大于 0 的抛出并显示唯一用户,但附加的长度与所需的排序不符。我发现 length
值是与用户关联的具有最低 user_throws
.id
的 throw 的值。正确的查询应该是什么样的?
最佳答案
尝试:
SELECT longthrow,id,name FROM (
SELECT max(t.length) longthrow,u.id,u.name
FROM users u, user_throws t
WHERE u.id=t.user_id
AND t.length>0
GROUP BY u.id
) ORDER BY longthrow DESC
哪个应该给你每个用户最长的 throw ,按最远的优先排序,最短的最后 - 认为这就是你想要的;)
而且我应该在评论出现之前添加,最好从以下开始:
SELECT max(t.length) longthrow,u.id,u.name
比:
SELECT max(t.length) longthrow,u.*
关于SQL - 正确查询按其他表中的值对项目进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3736953/