Запрос, который удаляет дублирующуюся запись с помощью mysql

#mysql #database

Вопрос:

Моя цель-создать запрос, который удаляет дублирующуюся запись в строке с помощью MySQL 5.7. Моя текущая функция сопоставляет записи с одинаковым весом, однако у нее есть дубликат. (Пожалуйста, смотрите 2-ю таблицу)

Вот моя таблица ввода.

 entryID| entryName | weight | ------------------------------- 1 | lamok2 | 1970 | 2 | lamok2 | 1955 | 3 | lamok3 | 1965 | 4 | lamok3 | 1975 | 5 | lamok3 | 1985 | 6 | lamok4 | 1955 | 7 | lamok4 | 1960 | 8 | lamok4 | 1975 | 9 | lamok5 | 1955 | 10 | MA1 | 2000 | 11 | MA2 | 2010 |  

После применения моего запроса, который:

 SELECT t1.entryName AS mname, t1.weight AS weight,  MIN(t2.entryName) AS wname,MIN(t2.weight) AS weight FROM entry t1 LEFT JOIN entry t2 ON t1.weight = t2.weight AND t1.entryName != t2.entryName GROUP BY t1.entryID, t1.entryName, t1.weight  it produces this:  mname| weight | wname | weight|  -------------------------------------------- lamok2 | 1970 | NULL | NULL | lamok2 | 1955 | lamok4 | 1955 | lamok3 | 1965 | NULL | NULL | lamok3 | 1975 | lamok4 | 1975 | lamok3 | 1985 | NULL | NULL | lamok4 | 1955 | lamok2 | 1955 | lamok4 | 1960 | NULL | NULL | lamok4 | 1975 | lamok3 | 1975 | lamok5 | 1955 | lamok2 | 1955 | MA1 | 2000 | NULL | NULL | MA2 | 2010 | NULL | NULL |  

Как мы видим по результату, Lamok 2 and Lamok 4 had a 2 matches Lamok 3 and Lamok 4 had a 2 matches too … Это не должно быть возможно… Это засчитывается как дублирующий бой. Как я могу избежать такого рода дублирования в моем запросе?

Это мой целевой результат: (Никаких повторяющихся боев)

 mname| weight | wname | weight|   --------------------------------------------  lamok2 | 1970 | NULL | NULL |  lamok2 | 1955 | lamok4 | 1955 |  lamok3 | 1965 | NULL | NULL |  lamok3 | 1975 | lamok4 | 1975 |  lamok3 | 1985 | NULL | NULL |  lamok4 | 1960 | NULL | NULL |  lamok5 | 1955 | lamok2 | 1955 |  MA1 | 2000 | NULL | NULL |  MA2 | 2010 | NULL | NULL |  

Комментарии:

1. Какова логика запроса?

2. Каков ваш ожидаемый результат?

3. Извините, логика моего запроса заключается в том, чтобы сопоставлять записи с одинаковым весом. Однако в моей текущей функции работает тот же вес, но у него есть дублирующий бой. Как мы видим, у ламока 2 и ламока 4 было 2 матча. также Ламок 3 и 4. Это должно быть только 1 совпадение, и дубликата не должно быть. Заранее благодарю вас за комментарии ^_^

4. Я новичок в этом деле. При всем уважении, могу ли я попросить вас пересмотреть мой код? Спасибо. Оцененный.

5. Каковы критерии увязки? Почему lamok4 | 1955 связано с lamok2 | 1955 , но не связано с lamok5 | 1955 ?

Ответ №1:

Я думаю, что вам нужно сгруппироваться по двум столбцам, по entryName и. weight

Таким образом, этот запрос вернет ваши дубликаты:

 SELECT * FROM entry GROUP BY entryName, weight HAVING COUNT(*) gt; 1  

Когда вы найдете дубликаты, вы можете удалить их. Если вы хотите удалить их с помощью запроса, то вы можете использовать что-то вроде этого:

 DELETE FROM entry WHERE entryID IN (  SELECT e.entryID   FROM entry AS e  GROUP BY e.entryName, e.weight  HAVING COUNT(*) gt; 1 )