У меня есть три таблицы, которые я хотел бы объединить, чтобы вывести все записи из одной таблицы и любых соответствующих записей или 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
Можно ли это сделать?
Существует пример вывод в исходном сообщении, второй кодовый блок. – mkjeldsen
@Quail извините, мой плохой. – jasper