2010-10-21 4 views
0

У меня есть три таблицы, которые я хотел бы объединить, чтобы вывести все записи из одной таблицы и любых соответствующих записей или NULL из другой таблицы. Крайне важно вернуть все записи из первой таблицы. Я думал, что сделал это раньше, но не могу вспомнить, когда и где, а MySQL просто не играет в мяч.MySQL join, пустые строки в таблице соединений

SELECT VERSION(); 
5.0.51a-3ubuntu5.7 

/* Some table that may or may not be needed, included to give context */ 
CREATE TABLE `t1` (
    `a` int(4) NOT NULL, 
    `a_name` varchar(10) NOT NULL, 
    PRIMARY KEY (`a`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

CREATE TABLE `t2` (/* "One table" */ 
    `b` int(2) NOT NULL, 
    `b_name` varchar(10) NOT NULL, 
    PRIMARY KEY (`b`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

CREATE TABLE `t3` (/* "Another table" */ 
    `a` int(4) NOT NULL, 
    `b` int(2) NOT NULL, 
    PRIMARY KEY (`a`,`b`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO t1 VALUES (1, '1-one'),(2, '1-two'),(3, '1-three'); 
INSERT INTO t2 VALUES (1, '2-one'),(2, '2-two'),(3, '2-three'), 
         (4, '2-four'),(5, '2-five'); 
INSERT INTO t3 VALUES (1,1),(1,2),(1,3),(1,4),(2,2),(2,5); 

t3 является узлом таблица для t1 и t2. Результирующий набор я ищу должен выглядеть следующим образом для любого a=n:

n=1 
b | b_name | a 
------------------- 
1 | 2-one | 1 
2 | 2-two | 1 
3 | 2-three | 1 
4 | 2-four | 1 
5 | 2-five | NULL 

n=2 
b | b_name | a 
------------------- 
1 | 2-one | NULL 
2 | 2-two | 2 
3 | 2-three | NULL 
4 | 2-four | NULL 
5 | 2-five | 2  

n=7 
b | b_name | a 
------------------- 
1 | 2-one | NULL 
2 | 2-two | NULL 
3 | 2-three | NULL 
4 | 2-four | NULL 
5 | 2-five | NULL 

значение a в наборе результатов на самом деле не имеет значения, пока он однозначно отражает наличие или отсутствие записей в t3 (Имеет ли это смысл?).

Запрос

SELECT t2.b, t2.b_name, a 
    FROM t2 
    LEFT /* OUTER */ JOIN t3 ON t3.b = t2.b 
    WHERE (
    a = 2 
    OR 
    a IS NULL 
    ); 

возвращает

b | b_name | a 
------------------- 
2 | 2-two | 2 
5 | 2-five | 2  

Можно ли это сделать?

ответ

1
SELECT t2.b, t2.b_name, MAX(IF(a=2, a, NULL)) AS a 
FROM t2 
    LEFT OUTER JOIN t3 
      ON t3.b = t2.b 
GROUP by t2.b 
ORDER BY b ASC; 
0

Что-то вроде этого? Если нет, можете ли вы привести пример вывода, который хотите получить.

 

select * from t1 
left join t3 using(a) 
left join t2 using(b) 
 
+0

Существует пример вывод в исходном сообщении, второй кодовый блок. – mkjeldsen

+0

@Quail извините, мой плохой. – jasper

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