选择组中除第一个以外的所有重复项

时间:2019-04-29 11:36:09

标签: mysql sql

我有以下查询:

SELECT id, token, cash
FROM users as tu 
WHERE (SELECT COUNT(*) FROM users WHERE users.token = tu.token) > 1 
ORDER BY token, cash DESC;

现在,它返回基于token的所有重复行,并且所有行都按cash值降序排列,因此具有最高token的重复cash为首先。

但是我想要实现的是返回所有重复的行,除了现金最高的重复令牌(基本上是一组中的第一行除外)。

请注意,由于MySQL版本的原因,我无法使用EXCEPT和OFFSET。

2 个答案:

答案 0 :(得分:1)

您需要比较cash,而不是count()

SELECT u.*
FROM users u 
WHERE u.cash < (SELECT MAX(u2.cash)
                FROM users u2
                WHERE u2.token = u.token
               )
ORDER BY u.token, u.cash DESC;

如果令牌只有一行(或者如果多行中所有cash都相同),则根本不会返回该令牌。

如果只想保留一行,则可以使用id

SELECT u.*
FROM users u 
WHERE u.id < (SELECTu2.id
              FROM users u2
              WHERE u2.token = u.token
              ORDER BY u2.cash DESC, u2.id DESC
             )
ORDER BY u.token, u.cash DESC;

答案 1 :(得分:1)

您可以使用EXISTS查询:

SELECT *
FROM users AS t
WHERE EXISTS (
    SELECT 1
    FROM users AS x
    -- row with same token exists
    -- that has higher cash value
    -- or same cash value and lower id value
    WHERE x.token = t.token
    AND (x.cash > t.cash OR (x.cash = t.cash AND x.id < t.id))
)