选择所有列,仅考虑每个用户的最高分数

问题描述 投票:0回答:2

已经到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 |
+-------+---------+------+

->当有重复值时,用户出现多次。

谁能指出我正确的方向?

mysql
2个回答
0
投票

我假设,当有重复的乐谱时,您希望最低的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)
  )  
);

-1
投票

只是:

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
© www.soinside.com 2019 - 2024. All rights reserved.