2009-09-08 2 views
1

У меня есть таблица, например, так:Показаны все дубликаты, бок о бок, в MySQL

Table eventlog 
user | user_group | event_date | event_dur. 
----  ---------- ---------  ---------- 
xyz   1   2009-1-1  3.5 
xyz   2   2009-1-1  4.5 
abc   2   2009-1-2  5 
abc   1   2009-1-2  5 

Обратите внимание, что в приведенных выше данных выборок, единственное надежное является дата и пользователь. Посредством более чем 90% моих вины, я смог разрешить пользователям дублировать свои ежедневные записи. В некоторых случаях дубликаты были предназначены для обновления их продолжительности, в других это была их попытка изменить user_group, с которой они работали с этим днем, а в других случаях и то, и другое.

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

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

Короче говоря, я пытаюсь выяснить, правильный запрос MySQL для возврата всех записей, которые содержат более одной записи для пользователя в любую заданную дату. Я боролся с GROUP BY и HAVING, но лучшее, что я могу получить, это список одного из двух дубликатов, за один дубликат, что было бы здорово, если бы я точно знал, что это было неправильно.

Вот ближайший я пришел:

SELECT * 
FROM eventlog 
GROUP BY event_date, user 
HAVING COUNT(user) > 1 
ORDER BY event_date, user 

Любая помощь с этим было бы чрезвычайно полезно. Если нужно, у меня есть список пользователей/дат для каждого набора дубликатов, поэтому я могу идти вручную и удалять все 400 из них, но я бы скорее их всех увидел сразу.

Спасибо!

+0

У меня была аналогичная проблема, и работал вокруг него, выбрав выход из группы по запросу (например, как у вас) в новую таблицу, а затем отбрасывая оригинал данные. –

+0

Это может помочь, если я СОЮЗЬ их обратно вместе. Но я должен пройти один за другим, чтобы определить, что сохранить и который удалить. – Anthony

ответ

1

Будет ли это работать?

SELECT event_date, user 
FROM eventlog 
GROUP BY event_date, user 
HAVING COUNT(*) > 1 
ORDER BY event_date, user 

Что меня выбрасывает, это пункт COUNT (пользователя), который у вас есть.

+0

Я думал, что должен был иметь что-то в этом 'COUNT()', чтобы указать, в каком столбце были дублированные данные (какой из них был продублирован не так?), В любом случае, тестирование сейчас ... – Anthony

+0

Крысы, те же результаты. Все еще просто получаю один набор дубликатов, а не оба. Я знаю, что это проблема с GROUP BY – Anthony

+0

Возможно ли, что ваше поле даты содержит значение временной метки (например, 4:00 PM)? Это может исключить то, что в противном случае выглядело бы как пара. –

1

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

1

Я думаю, что это будет работать (непроверенные)

SELECT * 
FROM eventlog e1 
WHERE 1 < 
(
    SELECT COUNT(*) 
    FROM eventlog e2 
    WHERE e1.event_date = e2.event_date 
    AND  e1.user = e2.user 
) 
-- AND [maybe an additionnal constraint to find the bad duplicate] 
ORDER BY event_date, user; 
; 

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

  • Нет связанных вопросов^_^