2013-07-31 2 views
1

У меня есть три связанных таблиц - order_tab который содержит заказы, autosorder_tab, который соединяет два других и auto_tab, который содержит все автомобили в магазине.
Один заказ может содержать любое количество автомобилей.Множественный выбор из трех таблиц

CREATE TABLE order_tab 
(`id` int, `_phone` varchar(10), `_email` varchar(9), `_date` varchar(10)) 
; 

INSERT INTO order_tab 
(`id`, `_phone`, `_email`, `_date`) 
VALUES 
(1, '111-111111', '[email protected]', '2013-08-19') 
; 

CREATE TABLE auto_tab 
(`id` int, `us_id` int, `str_1` varchar(3), `str_2` varchar(8)) 
; 

INSERT INTO auto_tab 
(`id`, `us_id`, `str_1`, `str_2`) 
VALUES 
(2, 0, 'BMW', '530i E60'), 
(6, 0, 'BMW', '530i') 
; 

CREATE TABLE autosorder_tab 
(`id` int, `au_id` int, `or_id` int, `hours` int, `price` decimal(19,2)) 
; 

INSERT INTO autosorder_tab 
(`id`, `au_id`, `or_id`, `hours`, `price`) 
VALUES 
(1, 2, 1, 3, 2700), 
(2, 6, 1, 2, 3500) 

order_tabидентификатор - это основной. or_id от autosorder_tab является ID от заказ_tab. au_id is id от auto_tab
Как выбрать все заказы для всех автомобилей в каждом заказе?

+0

Итак, вы хотите вернуть все имена моделей в порядке как одну строку, это правильно? –

ответ

3

Если я правильно понял просто использовать JOIN

SELECT o.*, a.* 
    FROM autosorder_tab ao JOIN order_tab o 
    ON ao.or_id = o.id JOIN auto_tab a 
    ON ao.au_id = a.id 
ORDER BY o.id, a.id 

Вот SQLFiddle демо

UPDATE Если вы хотите сгруппировать информацию в целях использования GROUP BY и соответствующие агрегатные функции. Для имен автомобилей вы хотите использовать GROUP_CONCAT()

SELECT o.id, o._date, 
     GROUP_CONCAT(CONCAT(a.str_1, ' ', a.str_2) 
      ORDER BY a.str_1, a.str_2 
      SEPARATOR ',') autos, 
     SUM(hours) hours, 
     ... 
    FROM autosorder_tab ao JOIN order_tab o 
    ON ao.or_id = o.id JOIN auto_tab a 
    ON ao.au_id = a.id 
GROUP BY o.id 

Чтобы изменить использовал разделитель SEPARATOR положение. Или используйте запятую по умолчанию, а затем, когда итерация по набору результатов в коде клиента изменится в соответствии с правилами представления.

Вот SQLFiddle демо

+0

Это тоже хорошо, но не нужно дублировать заказ для каждого автомобиля. Все машины должны быть в одном порядке или я не понимаю? – DevellMen

+0

Пока это лучший подходящий вариант для меня! Благодаря! – DevellMen

+0

Можно ли не повторять тот же автомобиль, что и второй заказ? – DevellMen

1

Должно быть, как показано ниже. Попробуйте ..

ВЫБРАННЫЙ order_tab все строки.

Затем СОЕДИНИТЬ autosorder_tab, auto_tab и ЗАКАЗАТЬ по порядку id по убыванию.

SELECT * FROM order_tab 
INNER JOIN autosorder_tab ON order_tab.id = autosorder_tab.or_id 
INNER JOIN auto_tab ON auto_tab.id = autosorder_tab.au_id 
    ORDER BY order_tab.id DESC 
Смежные вопросы