SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.09.2011 19:41:53

gilnator
Участник
Зарегистрирован: 28.09.2011
Сообщений: 2

Помогите изменить структуру таблиц и перенести данные

Здраствуйте, собственно проблема:

есть таблица table1 вида:

id | some_id | attr_name | attr_value
1    1             attr1           value1
2    1             attr2           value2
3    2             attr1           value3
4    2             attr2           value4



Нужно из table1 сделать table2:

some_id | attr1           | attr2
1             value1           value2
2             value3           value4

Как это можно сделать?

Отредактированно gilnator (29.09.2011 09:54:24)

Неактивен

 

#2 28.09.2011 21:37:54

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Помогите изменить структуру таблиц и перенести данные

Описание какое-то странное, от куда в примере взялось value4?

REPLACE INTO
    table2
SELECT
    t0.som_id,
    t0.attr_value,
    t1.attr_value
FROM
    table1 t0
JOIN
    table1 t1
ON (t0.som_id = t1.som_id)
WHERE
   t0.attr_name = 'attr1'
   AND t1.attr_name = 'attr2'

Если у все som_id есть и attr1 и attr2.

REPLACE INTO
    table2
SELECT
    t0.som_id,
    t1.attr_value,
    t2.attr_value
FROM
    table1 t0
LEFT JOIN
    table1 t1 ON (t1.som_id=t0.som_id AND t2.attr_name='attr1')
LEFT JOIN
    table1 t2 ON (t2.som_id=t0.som_id AND t2.attr_name='attr2')
GROUP BY t0.som_id

Если у som_id может не быть какого-нибудь атрибута.

Отредактированно Александр Трофимов (28.09.2011 21:42:07)

Неактивен

 

#3 28.09.2011 22:18:56

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите изменить структуру таблиц и перенести данные

Добавлю еще свой вариант:

INSERT INTO table2
SELECT some_id, CONCAT(IF(attr_name='attr1', attr_value, '')), CONCAT(IF(attr_name='attr2', attr_value, ''))
FROM table1
GROUP BY some_id;

Если значения не текстовые, а числовые, — возможно, лучше подойдет
MAX() вместо CONCAT().

Неактивен

 

#4 28.09.2011 22:24:08

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Помогите изменить структуру таблиц и перенести данные

Хм, хороший вариант. +)

Неактивен

 

#5 29.09.2011 10:09:31

gilnator
Участник
Зарегистрирован: 28.09.2011
Сообщений: 2

Re: Помогите изменить структуру таблиц и перенести данные

Спасибо Александр, спасибо paulus!
Поправил value4.  Да, у som_id может не быть какого-нибудь атрибута в table1.

Осталась проблема:
Аттрибутов может быть много - attr1 ... attrN. ( attrX - это пример. А так они имеют нормальное название)
В таблице table2 уже есть все колонки для всех возможных аттрубутов  attr1 ... attrN.
Как решить задачу без привязки к именам атрибутов - IF(attr_name='attr1', attr_name='attr2', ... ? Чтобы все их не указывать?
Таких таблиц много. Т.е. не только table1:table2, а table3:table4, table5:table6 и набор аттрибутов может быть разный. Я хочу оформить в виде процедуры с передачей двух параметров table1,table2...

пс. прошу прощения за не совсем ясное описание...

Отредактированно gilnator (29.09.2011 10:27:49)

Неактивен

 

#6 29.09.2011 11:51:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите изменить структуру таблиц и перенести данные

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson