сгруппировать по mysql - PullRequest
       3

сгруппировать по mysql

0 голосов
/ 25 февраля 2011

Я пишу конвертер для переноса данных из старых систем в новые системы. Я использую php + mysql.

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

select * 
from table1
insert into table2 
ON DUPLICATE KEY UPDATE customer_information = concat('$firstName',',','$lastName')

Требуется время, чтобы обработать одну таблицу: (

Я размышляю, можно ли использовать group by и автоматически получать все сгруппированные записи?

Кроме проверки каждой записи и проверки дубликатов и т. Д .?

Например

select * 
from table1 
group by firstName, lastName
insert into table 2 only one record and add all users' 
first last name into column ALL_NAMES with comma

EDIT

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

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Я не знаю, что вы пытаетесь сделать с помощью customer_information, но если вы просто хотите перенести недублированный набор данных из одной таблицы в другую, это сработает:

INSERT IGNORE INTO table2(field1, field2, ... fieldx)
  SELECT DISTINCT field1, field2, ... fieldx
    FROM table1;

DISTINCT позаботится о строках, которые являются точными дубликатами. Но если у вас есть строки, которые являются только частичными дубликатами (например, с одинаковыми фамилиями и именами, но с другим адресом электронной почты), тогда IGNORE может помочь. Если вы поместите уникальный индекс в table2 (фамилия, имя), то IGNORE позаботится о том, чтобы была вставлена ​​только первая запись с lastnameX, firstnameY из таблицы1. Конечно, вам может не понравиться, какая запись пары частичных дубликатов выбрана.

ETA

Теперь, когда вы обновили свой вопрос, кажется, что вы хотите поместить значения нескольких строк в одно поле. Это, вообще говоря, плохая идея, потому что когда вы денормализуете свои данные таким образом, вы делаете их гораздо менее доступными. Кроме того, если вы группируете по (фамилия, имя), не будет имен во всех именах. Из-за этого в моем примере вместо этого используются программы mailmail. В любом случае, если вам действительно нужно это сделать, вот как:

INSERT INTO table2(lastname, firstname, allemails)
  SELECT lastname, firstname, GROUP_CONCAT(email) as allemails
    FROM table1
    GROUP BY lastname, firstname;
1 голос
/ 25 февраля 2011

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

select DISTINCT * from table1

вместо:

select * from table1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...