首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择组中除第一个之外的所有重复项

问选择组中除第一个之外的所有重复项
EN

Stack Overflow用户
提问于 2019-04-29 19:36:09
回答 2查看 223关注 0票数 0

我有以下疑问:

代码语言:javascript
复制
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值按降序排序的,所以cash最高的重复token是第一个。

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

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

EN

回答 2

Stack Overflow用户

发布于 2019-04-29 19:37:31

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-04-29 19:43:20

您可以使用EXISTS查询:

代码语言:javascript
复制
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))
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55902538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档