Пометить дубликаты в MySql с помощью php (без удаления) - PullRequest
0 голосов
/ 20 марта 2010

Итак, у меня возникли проблемы с запросом MySQL (см. другой вопрос ), и я решил попробовать другой подход.

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

Итак, мне нужно написать код, который выполняет следующее: 1. Пройдите мою таблицу БД. 2. Найдите дубликаты в столбце «ip». 3. Пометьте первый экземпляр каждого дубликата «0» (в столбце с именем «дубликат»), а остальные - «1».

Таким образом, позже я могу ВЫБРАТЬ только те строки, ГДЕ повторяющиеся = 0.

ПРИМЕЧАНИЕ. Если ваше решение связано с запросом SELECT, сначала прочтите другой вопрос - есть причина, по которой я не просто использую GROUP BY / DISTINCT.

Заранее спасибо.

1 Ответ

1 голос
/ 21 марта 2010

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

  SELECT t.ip,
         CASE 
           WHEN @ip != t.ip THEN @rank := 0 
           ELSE @rank := @rank + 1 
         END AS duplicate,
         @ip = t.ip
    FROM TABLE t
    JOIN (SELECT @rank := 0, @ip = NULL) r
ORDER BY t.ip

Первое вхождение значения ip будет иметь нулевое значение в столбце duplicate; все последующие записи будут увеличиваться на единицу. Если вы не хотите увеличивать число, используйте:

  SELECT t.ip,
         CASE 
           WHEN @ip != t.ip THEN 0 
           ELSE 1 
         END AS duplicate,
         @ip = t.ip
    FROM TABLE t
    JOIN (SELECT @ip = NULL) r
ORDER BY t.ip

Вы можете получить список уникальных строк IP из этого, используя его в подзапросе:

SELECT x.ip
  FROM (paste either query in here) x
 WHERE x.duplicate = 0
...