Удалите дублирующиеся строки в MySQL

В указанном коде отсутствует шаг, на котором вы запрашиваете у пользователя GitHub-идентификатор , делая запрос GET https://github.com/login/oauth/authorize. Я предполагаю, что вы включаете этот вызов где-то в своем коде, потому что необходимо получить значение sessionCode, которое вы передаете в теле вашего запроса POST https://github.com/login/oauth/access_token.

В любом случае, на этом шаге вы должны указать различные области действия , которые запрашивает ваше приложение. Запрошенные области передаются через параметр запроса scope, разделенный пробелами, если вы запрашиваете несколько областей. Например, следующее является запросом для областей user и public_repo:

GET https://github.com/login/oauth/authorize?
  client_id=...&
  scope=user%20public_repo

351
задан DineshDB 28 March 2018 в 00:41
поделиться

4 ответа

Очень простой способ сделать это - добавить индекс UNIQUE в 3 столбца. Когда вы пишете оператор ALTER , включите ключевое слово IGNORE . Примерно так:

ALTER IGNORE TABLE jobs
ADD UNIQUE INDEX idx_name (site_id, title, company);

Это приведет к удалению всех повторяющихся строк. В качестве дополнительного преимущества будущие дубликаты INSERT будут ошибаться. Как всегда, вы можете сделать резервную копию, прежде чем запускать что-то вроде этого ...

596
ответ дан 23 November 2019 в 00:24
поделиться

Это работает на меня:

DELETE t1 FROM tablename t1
INNER JOIN tablename t2 
WHERE 
    t1.id < t2.id AND
    t1.title = t2.title AND
    t1.company=t1.company AND
    t1.site_ID=t2.site_ID;
0
ответ дан 23 November 2019 в 00:24
поделиться

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

create temporary table tmpTable (id int);

insert  tmpTable
        (id)
select  id
from    YourTable yt
where   exists
        (
        select  *
        from    YourTabe yt2
        where   yt2.title = yt.title
                and yt2.company = yt.company
                and yt2.site_id = yt.site_id
                and yt2.id > yt.id
        );

delete  
from    YourTable
where   ID in (select id from tmpTable);

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

DELETE FROM YourTable USING YourTable, tmpTable WHERE YourTable.id=tmpTable.id
75
ответ дан 23 November 2019 в 00:24
поделиться

У меня есть этот фрагмент запроса для SQLServer, но я думаю, что его можно использовать в других СУБД с небольшими изменениями:

DELETE
FROM Table
WHERE Table.idTable IN  (  
    SELECT MAX(idTable)
    FROM idTable
    GROUP BY field1, field2, field3
    HAVING COUNT(*) > 1)

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

DELETE
FROM jobs
WHERE jobs.id IN  (  
    SELECT MAX(id)
    FROM jobs
    GROUP BY site_id, company, title, location
    HAVING COUNT(*) > 1)
6
ответ дан 23 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: