2014-11-26 5 views
1

Предположим, у меня есть таблица с 4 столбцами: ID (автоинкремент), имя, телефон и электронная почта. Проблема в том, что иногда имя повторяется. Например:Объединение строк в MySQL

+----+------+-------+--------------+ 
| id | name | phone | email  | 
+----+------+-------+--------------+ 
| 1 | aaa |  |    | 
| 2 | aaa | 123 |    | 
| 3 | aaa |  | [email protected] | 
+----+------+-------+--------------+ 

Что было бы лучшим способом объединить эти 3 записи в один со всеми полями? Ожидаемый результат будет следующим:

+----+------+-------+--------------+ 
| id | name | phone | email  | 
+----+------+-------+--------------+ 
| 4 | aaa | 123 | [email protected] | 
+----+------+-------+--------------+ 

Заранее благодарен!

ответ

2

Вы можете сделать это, используя агрегацию, за исключением установки id. Делает ли это то, что вы хотите?

select max(id) + 1, name, max(phone) as phone, max(email) as email 
from table t 
group by name; 

EDIT:

Если вы хотите вставки новое значение, а затем удалить старые, вы могли бы сделать:

insert into table(name, phone, email) 
    select max(id) + 1, name, max(phone) as phone, max(email) as email 
    from table t 
    group by name 
    having count(*) > 1; 

А потом:

delete t from table t join 
       (select t.name, max(id) as maxid 
       from table t 
       group by t.name 
      ) tt 
       on t.name = tt.name and t.id < tt.maxid; 
+0

Предполагая, что поле id является PK для этой таблицы, поскольку вы не знаете, какие идентификаторы уже присутствуют, я не что вы хотите выбрать поле id. В приведенном выше примере, если у вас уже есть строка с идентификатором 4, соответствующая имени bbb, тогда ваше утверждение завершится ошибкой. Если нет PK, это не вызовет ошибки, хотя, учитывая, что поле id является автоинвестом, вы, вероятно, не захотите его указывать – Vyas

+0

Первый бит - это то, что мне нужно. Мне не нужно вставлять, просто выберите объединение всех строк. Спасибо!! – Alex

+0

В этом случае не обращайте внимания на то, что я сказал! – Vyas

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