Как удалить все повторяющиеся строки (кроме первой) в MySQL? - PullRequest
0 голосов
/ 23 апреля 2020

Я только что наткнулся на эту тему;

Удалите все дублирующиеся строки, кроме одного в MySQL?

Это почти соответствует моим потребностям. Но у меня есть 2 таблицы, которые содержат несколько (связанных) повторяющихся строк.

Первая, главная таблица - это «сообщения». Во-первых, прежде чем что-то удалять, я бы хотел их выбрать:

SELECT * FROM `messages` n1, `messages` n2 WHERE n1.id > n2.id AND n1.datetime = n2.datetime AND n1.message = n2.message

Во-вторых, у меня есть «метки» таблицы, в которых строки имеют свой собственный идентификатор, но также есть ссылка на первую таблицу, что msgid. Итак, messages.id = tags.msgid

В указанном запросе найдены все дубликаты. Как показать также связанные строки во второй таблице?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Если вы хотите удалить дубликаты строк из обеих таблиц и оставить только строки с минимальным значением id в messages, вам следует присоединить labels к вашему запросу, но связать его только с дублирующимися строками, которые принадлежат таблица псевдонимов n1. Таким образом, чтобы выбрать все дублирующиеся строки, которые должны быть удалены из обеих таблиц:

SELECT n1.*, l.*
FROM messages n1 
INNER JOIN messages n2 
ON n1.id > n2.id AND n1.datetime = n2.datetime AND n1.message = n2.message
INNER JOIN labels l
ON l.msgid = n1.id;

и удалить дубликаты из обеих таблиц:

DELETE n1, l 
FROM messages n1 
INNER JOIN messages n2 
ON n1.id > n2.id AND n1.datetime = n2.datetime AND n1.message = n2.message
INNER JOIN labels l
ON l.msgid = n1.id;

См. Упрощенную demo .

0 голосов
/ 23 апреля 2020

Добавьте другую таблицу в объединение. Вам нужно будет присоединиться дважды, чтобы получить метку обоих сообщений в паре.

SELECT *
FROM messages AS m1
JOIN messages AS m2 ON m1.id > m2.id AND m1.datetime = m2.datetime
JOIN labels AS l1 ON l1.msgid = m1.id
JOIN labels AS l2 ON l2.msgid = m2.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...