2015-02-04 6 views
3

У меня есть 2 стола
товары: Информация о товарах. Элементы имеют «обычный» или «цифровой» тип.mysql данные заказа из таблицы, используя отношения из другой таблицы

id | name | itemtype 

CREATE TABLE IF NOT EXISTS `wares` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `itemtype` enum('usual','digital') NOT NULL DEFAULT 'usual', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

    INSERT INTO `wares` (`id`, `name`, `itemtype`) VALUES 
    (1, 'ware1', 'usual'), 
    (2, 'ware2', 'usual'), 
    (3, 'ware3', 'usual'), 
    (4, 'ware4', 'usual'), 
    (5, 'ware5', 'usual'), 
    (6, 'ware6', 'digital'), 
    (7, 'ware7', 'usual'), 
    (8, 'ware8', 'digital'), 
    (9, 'ware9', 'usual'), 
    (10, 'ware10', 'digital'); 

отношения: таблица с отношениями между элементами из таблицы изделий. Некоторые предметы с типом "usual" связанные с товаром с типом "digital". Не все элементы связаны.

id_usualware | id_digitalware 

CREATE TABLE IF NOT EXISTS `relations` (
    `id_usualware` int(11) NOT NULL, 
    `id_digitalware` int(11) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `relations` (`id_usualware`, `id_digitalware`) VALUES 
(1, 6), 
(4, 8), 
(7, 10); 

http://sqlfiddle.com/#!2/2831a/13

нужно выбрать данные из таблицы изделия используя таблицу отношения заказа ниже. Если элемент с типом "usual" имеет отношение с товаром "digital", то этот цифровой элемент следует за этим "usual". Как я могу это сделать с помощью MySQL?

id | name | itemtype 
1 | ware1 | 'usual' 
6 | ware6 | 'digital' 
2 | ware2 | 'usual' 
3 | ware3 | 'usual' 
4 | ware4 | 'usual' 
8 | ware8 | 'digital' 
5 | ware5 | 'usual' 
7 | ware7 | 'usual' 
10| ware10| 'digital' 
9 | ware9 | 'usual' 

ответ

2

Следующие должны получить ids в правильном порядке:

select coalesce(r.id_digitalware, w.id) 
from wares w left join 
    relations r 
    on r.id_digitalware = w.id 
order by coalesce(r.id_usualware, w.id), 
     (w.itemtype = 'usual') desc; 

Чтобы получить полные строки, вам нужно другое join:

select w2.* 
from wares w left join 
    relations r 
    on r.id_digitalware = w.id left join 
    wares w2 
    on w2.id = coalesce(r.id_digitalware, w.id) 
order by coalesce(r.id_usualware, w.id), 
     (w.itemtype = 'usual') desc; 

Here является SQL Скрипки.

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