Найти дубликаты записей в MySQL

У шимпанзе почты есть довольно хорошая статья о том, что не делать. (Я знаю, что это звучит не так, как нужно)

http://kb.mailchimp.com/article/common-html-email-coding-mistakes

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

Основы:

  • Имеют абсолютные пути для изображений (например, https://stackoverflow.com/random-image.png )
  • Использовать таблицы для макета (никогда не думал, что рекомендую это!) [/ ​​g4]
  • Использовать встроенные стили (и старая школа css тоже, самое самое 2.1, box-shadow не будет работать, например;))

Просто тест на столько клиентов электронной почты, сколько вы можете взять на себя, или использовать Litmus, как кто-то еще предложил выше! (кредит Джиму)

EDIT:

Почтовый шимпанзе проделали отличную работу, сделав этот инструмент доступным для сообщества.

Он применяет ваши классы CSS к вашим элементам html, встроенным для вас!

614
задан Chris Bartow 12 May 2009 в 18:24
поделиться

7 ответов

Ключ состоит в том, чтобы переписать этот запрос, чтобы его можно было использовать в качестве подзапроса.

SELECT firstname, 
   lastname, 
   list.address 
FROM list
   INNER JOIN (SELECT address
               FROM   list
               GROUP  BY address
               HAVING COUNT(id) > 1) dup
           ON list.address = dup.address;
669
ответ дан 22 November 2019 в 21:53
поделиться

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

Сюда, я запрашиваю таблицу и перечисляю все дублирующиеся строки с тем же user_id, market_place и sku:

select user_id, market_place,sku, count(id)as totals from sku_analytics group by user_id, market_place,sku having count(id)>1;

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

Первая двойная проверка, если правильные записи будут удалены. Здесь я выбираю запись среди дубликатов, которые будут удалены (уникальным идентификатором).

select a.user_id, a.market_place,a.sku from sku_analytics a inner join sku_analytics b where a.id< b.id and a.user_id= b.user_id and a.market_place= b.market_place and a.sku = b.sku;

Тогда я выполняю запрос на удаление для удаления простофиль:

delete a from sku_analytics a inner join sku_analytics b where a.id< b.id and a.user_id= b.user_id and a.market_place= b.market_place and a.sku = b.sku;

Резервное копирование, Двойная проверка, проверьте, проверьте, что резервное копирование тогда выполняется.

0
ответ дан Ganesh Krishnan 4 November 2019 в 07:32
поделиться
  • 1
    Если Вам нужны доступные данные к месяцу, к месяцу + день, к месяцу + день + час, и т.д., то Ваш подход в порядке. Если необходимо сделать что-то еще с ним, то это действительно зависит от варианта использования. Вы могли бы даже быть прекрасными просто использование массива как [month, day, hours, min, sec] или простая строка как ключ хеша; но я can' t говорят, не зная больше. – molf 26 July 2010 в 21:56
    SELECT *
    FROM (SELECT  address, COUNT(id) AS cnt
    FROM list
    GROUP BY address
    HAVING ( COUNT(id) > 1 ))
2
ответ дан 22 November 2019 в 21:53
поделиться

Почему бы просто не СОЕДИНЯТЬ таблицу с самой собой?

SELECT a.firstname, a.lastname, a.address
FROM list a
INNER JOIN list b ON a.address = b.address
WHERE a.id <> b.id

DISTINCT необходим, если адрес может существовать более двух раз.

193
ответ дан 22 November 2019 в 21:53
поделиться
 SELECT firstname, lastname, address FROM list
 WHERE 
 Address in 
 (SELECT address FROM list
 GROUP BY address
 HAVING count(*) > 1)
4
ответ дан 22 November 2019 в 21:53
поделиться

Это выберет дубликаты за один проход таблицы, без подзапросов.

SELECT  *
FROM    (
        SELECT  ao.*, (@r := @r + 1) AS rn
        FROM    (
                SELECT  @_address := 'N'
                ) vars,
                (
                SELECT  *
                FROM
                        list a
                ORDER BY
                        address, id
                ) ao
        WHERE   CASE WHEN @_address <> address THEN @r := 0 ELSE 0 END IS NOT NULL
                AND (@_address := address ) IS NOT NULL
        ) aoo
WHERE   rn > 1

Этот запрос фактически эмулирует ROW_NUMBER () , присутствующий в Oracle и ] SQL Server

Подробнее см. В статье в моем блоге:

10
ответ дан 22 November 2019 в 21:53
поделиться

Не очень эффективно, но должно работать:

SELECT *
FROM list AS outer
WHERE (SELECT COUNT(*)
        FROM list AS inner
        WHERE inner.address = outer.address) > 1;
10
ответ дан 22 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

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