2010-05-17 5 views
0

У меня есть выход из избранных, как это:Преобразование MySQL Resultset из строк в Колонном

04:47:37> select * from attributes left outer join trailer_attributes on attributes.id = trailer_attributes.attribute_id; 
+----+--------------+----------+-----------+------------+--------------+-----------------+ 
| id | name   | datatype | list_page | trailer_id | attribute_id | attribute_value | 
+----+--------------+----------+-----------+------------+--------------+-----------------+ 
| 1 | Make   | text  |   1 |   1 |   1 | Apple   | 
| 1 | Make   | text  |   1 |   2 |   1 | sdfg   | 
| 2 | Year   | number |   1 |   1 |   2 | 2009   | 
| 2 | Year   | number |   1 |   2 |   2 | sdfg   | 
| 3 | Type   | text  |   0 |   1 |   3 | iPhone   | 
| 3 | Type   | text  |   0 |   2 |   3 | sdfg   | 
| 4 | Axles  | text  |   0 |   1 |   4 | asdf   | 
| 4 | Axles  | text  |   0 |   2 |   4 | sdfg   | 
| 7 | Size   | text  |   0 |   1 |   7 | asd1   | 
| 7 | Size   | text  |   0 |   2 |   7 | sdfg   | 
| 8 | Frame  | text  |   0 |   1 |   8 |     | 
| 8 | Frame  | text  |   0 |   2 |   8 | sdfg   | 
| 9 | Height  | text  |   0 |   1 |   9 |     | 
| 9 | Height  | text  |   0 |   2 |   9 | sdfg   | 
| 10 | Dollies  | text  |   0 |   1 |   10 |     | 
| 10 | Dollies  | text  |   0 |   2 |   10 | sdfg   | 
| 11 | Tires/Wheels | text  |   0 |   1 |   11 |     | 
| 11 | Tires/Wheels | text  |   0 |   2 |   11 | sdfg   | 
| 12 | Condition | text  |   1 |   1 |   12 | New    | 
| 12 | Condition | text  |   1 |   2 |   12 | sdfg   | 
| 13 | Title  | text  |   0 |   1 |   13 |     | 
| 13 | Title  | text  |   0 |   2 |   13 | sdfg   | 
+----+--------------+----------+-----------+------------+--------------+-----------------+ 

Я хочу, чтобы преобразовать его в нечто большее, вдоль линий:

id, Make, Year, Type, Axles, Size, Frame (etc) 
1, Apple, 2009, iPhone, ..... 
2, sdfg, sdfg, sdfg, ..... 

Любые предложения?

+0

Возможный дубликат [Как развернуть схему сущностей-атрибутов MySQL] (http://stackoverflow.com/questions/649802/how-to-pivot-a-mysql-entity-attribute-value-schema) –

ответ

3

Mmmm ... EAVs. Одной из многих причин избежать EAV (entity-attribute_value) является то, что их сложнее сообщить и запросить. Однако, если атрибуты, которые вы хотите, известны заранее, вы можете сделать что-то вроде:

Select id 
    , Min(Case When name = 'Make' Then attribute_value End) As Make 
    , Min(Case When name = 'Year' Then attribute_value End) As Year 
    , Min(Case When name = 'Type' Then attribute_value End) As Type 
    , Min(Case When name = 'Axles' Then attribute_value End) As Axles 
    , Min(Case When name = 'Size' Then attribute_value End) As Size 
    , Min(Case When name = 'Frame' Then attribute_value End) As Frame 
    , ... 
From attributes 
Where name In('Make','Year','Type','Axles','Size','Frame',....) 
Group By id 

Теперь, MySQL, действительно есть GROUP_CONCAT, который позволит вам объединить несколько значений для одного атрибута в списке, если вы разрешить это (например, если объект может иметь несколько атрибутов Make).

+1

Это сработало * отлично *, так как я знал ключи, которые мне нужны раньше времени. Благодаря! –

0

Возможно, это не вариант для вас, но в идеале вы должны преобразовать каждый атрибут в столбец основной таблицы. Реляционные базы данных предназначены для обработки атрибутов как столбцов, а не строк. Поэтому они работают намного лучше, когда вы их используете, и SQL становится намного проще.

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