2013-04-05 2 views
-1

У меня проблема с разработкой Self Join.MySQL Self Join Не все строки включены

У меня есть следующая таблица:

CREATE TABLE `test`.`tableN` (
`id` int(10) unsigned NOT NULL auto_increment, 
`Group` int(10) unsigned NOT NULL, 
`Item` int(10) unsigned NOT NULL, 
`data` varchar(45) default NULL, 
PRIMARY KEY (`id`) 
) 
ENGINE=InnoDB; 

INSERT INTO `test`.`tableN` (`Group`,`Item`,`data`) 
VALUES 
(1,100,'aaa'), 
(1,200,'bbb'), 
(2,100,'ccc'), 
(2,200,'ddd'), 
(3,100,'eee'); 

Что я тогда нужно сделать, это выполнить запрос, который выводит данные для каждого «элемента» в одной строке.

Запросов У меня есть:

SELECT 
t1.`Group`, 
t1.`item`, 
t1.`data`, 
t2.`item`, 
t2.`data` 
FROM tableN t1 
LEFT JOIN tableN t2 ON t2.`group`=t1.`group` 
WHERE 1=1 
AND t1.item = 100 
AND t2.item = 200 
GROUP BY t1.`Group`; 

Проблема заключается в том, возвращает только 2 строки (группа 1 и группа 2). Мне нужно также вернуть строку для Group = 3, даже если для элемента = 200 нет записи.

Как это сделать, пожалуйста.

ответ

1

Поместите t2.item = 200 состояние в РЕГИСТРИРУЙТЕСЬ положение.

SELECT 
t1.`Group`, 
t1.`item`, 
t1.`data`, 
t2.`item`, 
t2.`data` 
FROM tableN t1 
LEFT JOIN tableN t2 ON t2.`group`=t1.`group` AND t2.item = 200 
WHERE 1=1 
AND t1.item = 100 
GROUP BY t1.`Group`; 
1
SELECT `GROUP`, 
     MAX(CASE WHEN Item = 100 THEN data END) Item100, 
     MAX(CASE WHEN Item = 200 THEN data END) Item200 
FROM TableN 
WHERE Item IN (100, 200) 
GROUP BY `GROUP` 

ВЫВОД

╔═══════╦═════════╦═════════╗ 
║ GROUP ║ ITEM100 ║ ITEM200 ║ 
╠═══════╬═════════╬═════════╣ 
║  1 ║ aaa  ║ bbb  ║ 
║  2 ║ ccc  ║ ddd  ║ 
║  3 ║ eee  ║ (null) ║ 
╚═══════╩═════════╩═════════╝ 
2

Избавьтесь от ИНЕК, переместить весь его левый присоединиться:

SELECT 
    t1.`Group`, 
    t1.`item`, 
    t1.`data`, 
    t2.`item`, 
    t2.`data` 
    FROM `test`.`tableN` AS t1 
    LEFT JOIN `test`.`tableN` t2 ON t2.`group`=t1.`group` AND t1.item = 100 AND t2.item = 200 
    GROUP BY t1.`Group`; 

Fiddle

EDIT: это было (конечно) также получить вам строку, если только группа не соответствует ни 100, ни 200 равно t1 (или t2)