Mysql-запрос для удаления строк, имеющих повторяющиеся записи

Я хочу удалить все строки, которые имеют повторяющиеся записи, и я не хочу, чтобы сохранить одну из каждой. Я хочу удалить все записи, имеющие повторяющиеся записи. Здесь я сослался на некоторый код, который будет сохранять самое высокое или самое низкое значение идентификатора. Все запросы здесь останутся одной записью из повторяющихся записей.

Mysql Запрос я пробовал

DELETE * ,count(*)as n FROM cart by rfid HAVING n>1

Дизайн БД:

ID(PK)|RFID    |CATAGORY
1     |1       |5
2     | 1      | 5
3     | 2      | 4
4     |3       | 6

Выход:

ID(PK)|RFID|CATAGORY
2     | 1      | 5
3     | 2      | 4
4     |3       | 6

Ожидаемый результат:

ID(PK)|RFID|CATAGORY
3     | 2      | 4
4     |3       | 6

0

Решение

Выберите отдельные и самые старые записи (Замечания: используя MIN () и предполагая, что id — это режим автоинкремента и PK), просто переключитесь на MAX (), чтобы сохранить новейшие.

SELECT MIN(id) FROM cart group by rfid;

Все вместе (удаляя все, что не было в предыдущем, выберите

DELETE FROM cart where id NOT in (SELECT MIN(id) FROM cart group by rfid);

Вышеприведенное не сработает, потому что вы не можете указать целевую таблицу для обновления в предложении FROM (в данном случае DELETE), но вы можете обойти с помощью подвыбора, поэтому окончательный рабочий запрос будет:

DELETE FROM cart WHERE id NOT IN (SELECT MIN(A.id) FROM (SELECT * FROM cart) A group by A.rfid);

редактировать (чтобы удалить все записи с количеством> 1)

DELETE FROM cart WHERE id  IN(
SELECT A.id FROM (SELECT * FROM cart) A where A.rfid IN
(SELECT B.rfid from  (SELECT * FROM cart) B group by B.rfid having count(B.rfid)>1)
);
0

Другие решения

DELETE cart.* FROM cart INNER JOIN (SELECT rfid,catagory FROM cart GROUP BY rfid,catagory HAVING COUNT(*)>1) dup ON cart.rfid = dup.rfid AND cart.`catagory` = dup.`catagory`

Этот вопрос решил мою проблему. Спасибо

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector