首页 > 解决方案 > 选择除组中第一个之外的所有重复项

问题描述

我有以下查询:

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的重复是第一个。tokencash

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

请注意,由于 MySQL 版本,我不能使用 EXCEPT 和 OFFSET。

标签: mysqlsql

解决方案


您可以使用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))
)

推荐阅读