我有以下疑问:
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。
发布于 2019-04-29 19:37:31
您需要比较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;发布于 2019-04-29 19:43:20
您可以使用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))
)https://stackoverflow.com/questions/55902538
复制相似问题