我正在建立排行榜,并希望返回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,但不会返回正确的井号。
数据库看起来像这样:
排行榜数据库:
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
任何帮助将不胜感激
答案 0 :(得分:1)
问题是这样的:任何聚合函数都不关心其余的行 如果不是MIN而是SUM,则更容易看到...
该解决方案有些棘手,您应该执行涉及不等式的LEFT JOIN的操作:
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条件下过滤LEFT JOINed表很重要,否则我们将消除NULL过滤效果:
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
希望有帮助