#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 )