Mysql-запрос для удаления строк, имеющих повторяющиеся записи - PullRequest
0 голосов
/ 02 мая 2018

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

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                                                                                                                                                                                                                                                                                       

Ответы [ 2 ]

0 голосов
/ 02 мая 2018
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 голосов
/ 02 мая 2018

Выберите отдельные и самые старые записи ( Примечание: , используя 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)
);
...