我有以下查询:
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。
答案 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))
)