Выбрать все дубликаты, кроме первого в группе - PullRequest
0 голосов
/ 29 апреля 2019

У меня следующий запрос:

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 является первым.

Но чего я хочу добиться, так это вернуть все дублирующиеся строки, ЗА ИСКЛЮЧЕНИЕМ дублирующего токена с наибольшим количеством денег (в основном, за исключением первого ряда в группе).

Обратите внимание, что я не могу использовать EXCEPT и OFFSET из-за версии MySQL.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вы можете использовать запрос 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))
)
1 голос
/ 29 апреля 2019

Вам нужно сравнить 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...