返回一个min()和另一个字段?

sycxhyv7  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(327)

这个问题在这里已经有答案了

检索每个组中的最后一条记录-mysql(29个答案)
两年前关门了。
我正在构建一个排行榜,并希望返回一个min()值-但是,我还希望另一个字段与min值位于同一行。
到目前为止我有:

SELECT u.username, MIN(timer) AS intScore, l.hashtag 
        FROM users u 
        JOIN leaderboard l ON l.users_id = u.users_id 
        GROUP BY u.username
        ORDER BY 
        intScore ASC

…这将返回正确的min intscore,但不是正确的hashtag。
db看起来像这样:
排行榜数据库:

users_id, timer, hashtag
1, 10, TEST
2, 12, TEST
1, 20, TEST
3, 15, TEST
1, 5, LIVE
4, 20, LIVE

我希望结果是:

users_id, timer, hashtag
1, 5, LIVE
2, 12, TEST
3, 15, TEST
4, 20, LIVE

任何帮助都将不胜感激

uqxowvwt

uqxowvwt1#

事情是这样的:任何聚合函数“不关心”它的行的其余部分,如果它不是min而是sum,那么更容易看到。。。
解决方法有点棘手,你应该做一些涉及左连接和不等式的事情:

SELECT u.username, l.timer AS intScore, l.hashtag

FROM
 leaderboard l
 INNER JOIN users u ON u.users_id = l.users_id
 LEFT JOIN leaderboard l2 ON l.users_id = l2.users_id AND l2.timer < l.timer
WHERE
 l2. users_id IS NULL
ORDER BY intScore ASC

其思想是通过跳过min函数并获取整行来获得最小值
从排行榜表中按日期(或任何其他列/标准)筛选,将要求我们筛选我们使用的每个表。重要的是在on条件下筛选左联接表,否则我们将消除筛选空值影响:

SET @date0 = '2018-01-01';
SELECT u.username, l.timer AS intScore, l.hashtag

FROM
 leaderboard l
 INNER JOIN users u ON u.users_id = l.users_id
 LEFT JOIN leaderboard l2 ON l.users_id = l2.users_id AND l2.timer < l.timer AND l2.game_date >= @date0
WHERE
 l.game_date >= @date0
 l2.users_id IS NULL
ORDER BY intScore ASC

希望有帮助

相关问题