已经到asked before,但我无法使其正常工作。所选答案不适用于重复的值。第二个答案应该能够根据张贴者处理重复项,但是它不能正确处理我的数据。
我想要实现的非常简单:
我有一个数据库,其中包含所有用户的所有分数。我想建立一个高分表,所以我想选择每个用户的所有高分行。高分行是指该用户分数最高的行。
Here's a demo是根据我在顶部提到的答案做出的:
CREATE TABLE test(
score INTEGER,
user_id INTEGER,
info INTEGER
);
insert into test(score, user_id, info)
values
(1000, 1, 1),
(1000, 1, 2),
(2000, 2, 3),
(2001, 2, 1);
-
SELECT t.*
FROM test t
JOIN (SELECT test.user_id, max(score) as mi FROM test GROUP BY user_id) j ON
t.score = j.mi AND
t.user_id = j.user_id
ORDER BY score DESC, info ASC;
预期输出:
+-------+---------+------+
| score | user_id | info |
+-------+---------+------+
| 2001 | 2 | 1 |
| 1000 | 1 | 1 |
+-------+---------+------+
->每个user_id都与用户具有最高得分值的行一起出现。
实际输出:
+-------+---------+------+
| score | user_id | info |
+-------+---------+------+
| 2001 | 2 | 1 |
| 1000 | 1 | 1 |
| 1000 | 1 | 2 |
+-------+---------+------+
->当有重复值时,用户出现多次。
谁能指出我正确的方向?
我假设,当有重复的乐谱时,您希望最低的info
与您的预期输出一样。使用NOT EXISTS
:
select t.* from test t
where not exists (
select 1 from test
where user_id = t.user_id and (
score > t.score or (score = t.score and info < t.info)
)
);
只是:
SELECT user_id, info, max(score) as max_score FROM test GROUP BY user_id
然后,如果您需要连接另一个表,请使用别名:
SELECT t.user_id, t.info, max(score) as max_score, u.*
FROM test
GROUP BY user_id
JOIN user as u
ON u.user_id = t.user_id