2010-09-23 3 views
4

У меня есть этот запроспоказать повторяющиеся записи

SELECT id, timeOrdered, order_desc, firstname, lastname 
FROM `db`.`myTable` 
WHERE `myTable`.`customer_number` IN (100, 101, 102, 103, 104, 105) 

Я пытаюсь выяснить, какие повторяющиеся записи. Если timeOrdered, order_desc, firstname, lastname совпадают, то его обман.

Что бы запрос для этого
Благодарности

+0

Возможный дубликат [Найти дубликаты записей в MySQL] (http: // stackoverf low.com/questions/854128/find-duplicate-records-in-mysql) –

ответ

11

Чтобы увидеть, какие значения имеют дубликаты:

SELECT t.order_desc, 
     t.firstname, 
     t.lastname 
    FROM db.mytable t 
    WHERE t.customer_number IN (100, 101, 102, 103, 104, 105) 
GROUP BY t.order_desc, t.firstname, t.lastname, t.timeordered 
    HAVING COUNT(*) > 1 

Чтобы посмотреть все записи, связанные с этими дубликатами:

SELECT x.* 
    FROM db.mytable x 
    WHERE EXISTS(SELECT NULL 
       FROM db.mytable t 
       WHERE t.customer_number IN (100, 101, 102, 103, 104, 105) 
        AND t.order_desc = x.order_desc 
        AND t.firstname = x.firstname 
        AND t.lastname = x.lastname 
        AND t.timeordered = x.timeordered 
      GROUP BY t.order_desc, t.firstname, t.lastname, t.timeordered 
       HAVING COUNT(*) > 1) 
WHERE x.customer_number IN (100, 101, 102, 103, 104, 105) 
+0

Добавить timeOrdered column в сравнение – SDReyes

+0

@SDReyes: Исправлено, thx. –

+0

Удалить предложение where в последней строке – SDReyes

3
SELECT DISTINCT 
    t1.id 
FROM 
    mytable t1 
    INNER JOIN mytable t2 ON 
     t1.timeordered = t2.timeordered AND 
     t1.order_desc = t2.order_desc AND 
     t1.firstname = t2.firstname AND 
     t1.lastname = t2.lastname AND 
     t1.id <> t2.id 
+1

Этот запрос будет генерировать дубликаты в наборе результатов, если, например, есть три строки, которые равны. Четкое «может» помочь. Тем не менее, это решение использует объединения для сравнения, то есть более быстрое большинство времени. +1 :) – SDReyes

+0

@SDReyes: Дублирование - это реальность JOINING; EXISTS может быть быстрее при работе с совпадением 2+, а не дублировать результаты. 'IN' обычно не поддерживает кортежи (но делает на MySQL) –

+1

@OMG Ponnies: Да. ваше решение занимает 79 мс тестирование на SQL Server с ~ 100 000 строк. используя объединения, потребуется 1872 мс. Удивительно: О. поздравляет OMG! :) – SDReyes

Смежные вопросы