2015-03-21 2 views
0

У меня проблема.Слияние записей SQL

Я это MySQL таблицы:

id | name | subid 
1 | Joe | 5 
2 | Carl | 6 
3 | Bob | 7 
4 | Joe | 8 
5 | Carl | 9 

, и я хочу, чтобы объединить его так:

id | name | subids 
1 | Joe | 5,8 
2 | Carl | 6,9 
3 | Bob | 7 

Возможно ли это? У меня есть действительно большая база данных, и если бы я сделать это с помощью PHP-Cronjob, это заняло бы неделю ...

+0

Заканчивать [GROUP_CONCAT] (http://dev.mysql.com/doc/refman/5.5/en/group- by-functions.html # function_group-concat) – mhall

ответ

0

Вы ищете group_concat():

select min(id) as id, name, group_concat(subid) as subids 
from table t 
group by name; 
+0

Это так здорово, спасибо много! – cheek

0

Объединения строк, безусловно, возможно с GROUP BY и GROUP_CONCAT. Однако это заменит одну проблему другой, возможно, даже более серьезной проблемой. Во всяком случае, вы должны разделить таблицу, а не объединять ее.

Создайте две таблицы - одну для пользователей и другую для пользовательских под-идентификаторов. Заполнение этих двух будет очень легко, и в итоге у вас будет хорошо нормализованная схема.

CREATE TABLE USER_SUBID (USER_ID int, SUBID int); 

CREATE TABLE NEW_USER (ID int, NAME varchar(20)); 

INSERT INTO NEW_USER (ID, NAME) 
SELECT MIN(Id) as ID, NAME 
FROM OLD_USERS 
GROUP BY NAME 

INSERT INTO USER_SUBID (USER_ID, SUBID) 
SELECT MIN(Id) as USER_ID, SUBID 
FROM OLD_USERS 
GROUP BY NAME, SUBID 

Это позволит сделать две таблицы с данными следующим образом:

NEW_USER: 
ID Name 
-- ---- 
1 Joe 
2 Carl 
3 Bob 

USER_SUBID: 
USER_ID SUBID 
------- ----- 
1  5 
1  8 
2  6 
2  9 
3  7 
+0

Это так здорово, спасибо много! – cheek

+1

@ dasblinkenlight. , , Интересно. Я интерпретировал «слияние» только как вывод. Я согласен с вами в том, что вы не должны хранить данные в базе данных с помощью списков с разделителями-запятыми, и ваш подход является лучшим подходом для хранения данных. –

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