2015-02-12 3 views
1

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

Order 
-------- 
order_id 

Order_product 
------------- 
order_id 
order_product_id 

order_product_attribute 
------------------------------ 
orders_products_attributes_id 
order_id 
product_id 
products_options 
options_id 

=== Data === 
|1|2|7|Size  |1|270 
|2|2|7|Colour(s) |3|99202 
|3|2|8|Size  |1|270 
|4|2|8|Colour(s) |3|47768 

Мой результат желания должно быть следующим:

order_id, product_id, size_options_id (option_id for size), colour_options_id (option_id for color) 

size_options_id не является обязательным, что означает, что не может даже существовать для некоторых продуктов.

Я не уверен, что мне нужно использовать, чтобы получить этот результат за один раз, а не делать это из проверки PHP.

+0

Не хранить данные, как это! Используйте разные столбцы/таблицы, а не атрибуты. – jarlh

+1

Я думаю, что вы должны предоставить точную структуру и данные всех ваших таблиц. Почему данные имеют 6 столбцов? – rtruszk

+0

Размер идентификатора цвета - это только значение параметра option_id для параметра размера и цвета id - options_id снова для цветов .. его хранятся в 2 строках, нам нужна одна строка .., которая не хранится в базе данных. – Basit

ответ

0

Предполагая, что ваши таблицы следующим образом:

create table order (order_id int); 
insert into order values(2); 

create table order_product (order_id int, order_product_id int); 
insert into order_product values (2,7); 
insert into order_product values (2,8); 

create table order_product_attribute (orders_products_attributes_id int, order_id int, product_id int, products_options int, options_id int); 
insert into order_product_attribute values (1, 2, 7, 1, 270); 
insert into order_product_attribute values (2, 2, 7, 3, 99202); 
insert into order_product_attribute values (3, 2, 8, 1, 270); 
insert into order_product_attribute values (4, 2, 8, 3, 47768); 

desired output: 

2 7 270 99202 
2 8 270 47768 

Вы должны использовать два слева соединения. Это должно быть примерно так:

select 
    o.order_id, 
    op.product_id, 
    opas.options_id as size_options_id, 
    opac.options_id as colour_options_id 
from my_order o 
join order_product op on op.order_id=o.order_id 
left join order_product_attribute opas 
    on opas.order_id=o.order_id 
    and opas.product_id=op.product_id 
    and opas.product_options=1 
left join order_product_attribute opac 
    on opac.order_id=o.order_id 
    and opac.product_id=op.product_id 
    and opac.product_options=3 

Первое левое соединение соединяется только с этими строками, которые содержат размеры.
Второе левое соединение объединяется с строками, содержащими цвета.

Вы можете увидеть его в SQLFiddle

+0

Это дает мне нулевое значение для размеров и цветов – Basit

+0

@Basit Какие данные у вас есть в столбце 'product_options'? Номера (1, 3) или имена (цвет, размер)? – rtruszk

+0

Только 1, 2 и 3 – Basit