SQL - 正确查询按其他表中的值对项目进行排序

标签 sql mysql

我在正确查询时遇到了一点问题,希望您能帮助我。我的测试表结构如下:

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 者。所以我需要一个查询结果是:

  1. 由用户过滤,只有有任何 throw 且 throw 长度大于 0 的用户才是正确记录。
  2. 按重复项过滤,因此只有唯一用户出现在列表中(我想是 GROUP BY)。
  3. 按 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/

相关文章:

mysql - 如何计算最近一年的 MySQL 中具有旧值的表?

javascript - 在 JavaScript 事件上更新与 MySQL 的聊天

sql - 如何使用executeUpdate()删除具有GORM(Grails)和HQL(Hibernate)的实体

mysql - sql中查找不常见用户

sql - oracle db中number字段的查询

mysql - 具有多个用户类别的模式数据库

php - sphinx 不匹配正确的符号

分组聚合的 SQL 选择标准

mysql - mysql中数据库表设计方法

python - 如何将数据从时间戳修改为每个用户每天的消耗量?