2014-10-05 2 views
2

У меня есть две таблицы, которые я пытаюсь завершить с полным внешним соединением.mysql external join not show null results

availability 
availability_id availability_desc 
1     Monday Morning 
2     Monday Afternoon 
3     Monday Evening 
etc 

user_availability 
user_id   availability_id 
1    1 
1    3 
etc 

SELECT * from availability a left outer join user_availability u 
on a.availability_id=u.availability_id; 

дает результат:

availability_id; availability_desc;  id;  user_id;  availability_id 
1;    Monday Morning;   1;  1;    1 
1;    Monday Morning;   15;  2;    1 
1;    Monday Morning;   40;  4;    1 
1;    Monday Morning;   57;  5;    1 
2;    Monday Afternoon;   2;  1;    2 
3;    Monday Evening;   16;  2;    3 
3;    Monday Evening;   42;  4;    3 

Право внешнее соединение на одних и тех же таблицах результатов в:

availability_id  availability_desc id user_id availability_id 
1     Monday Morning  1 1  1 
2     Monday Afternoon 2 1  2 
4     Tuesday Morning  3 1  4 

Объединение правого и левого внешнего соединения дает следующие результаты:

availability_id availability_desc id user_id availability_id 
1    Monday Morning  1 1  1 
1    Monday Morning  15 2  1 
1    Monday Morning  40 4  1 
1    Monday Morning  57 5  1 
2    Monday Afternoon 2 1  2 
2    Monday Afternoon 30 3  2 
2    Monday Afternoon 41 4  2 
3    Monday Evening  16 2  3 
3    Monday Evening  42 4  3 

Я не ge tting любые нулевые значения, возвращаемые, когда в другой таблице нет соответствия. Я хочу сгенерировать результаты, которые выглядят примерно так:

availability_desc  user_id 
Monday Morning  1 
Monday Afternoon  1 
Monday Evening  (null) 

Не уверен, что я делаю неправильно.

+0

Итак, вы хотите, чтобы показать запись для каждого пользователя для каждого номера, имеют ли они соответствующую запись или нет? – Tom

+0

Учитывая ваши короткие данные образца, я получаю строку, возвращенную с нулевым user_id: http://sqlfiddle.com/#!2/e4be26/1 –

+0

@MichaelBerkowski Интересно, что я не получаю то же самое, используя мою фактическую структуру таблицы и данные. [http://sqlfiddle.com/#!2/94713/1/0] – turtlepower

ответ

0

Если вы хотите показать запись для каждого пользователя, для каждой доступности, независимо от того, есть ли у них соответствующая запись или нет, это сделает трюк. Предполагается, что существует таблица с именем user, в которой есть все пользователи в системе. С помощью CROSS JOIN вы можете получить каждую запись пользователя для каждой записи о доступности. Затем объединение обеих этих таблиц в таблицу user_availability покажет, доступен ли пользователь или нет.

SELECT * 

FROM availability a 

     cross join user u 

     LEFT JOIN user_availability ua 
     on u.user_id = ua.user_id 
     AND a.availability_id = ua.availability_id 
; 

Вот более читаемая версия, плюс sqlfiddle.

SELECT availability_desc, 
     user_name, 
     CASE WHEN ua.user_id IS NULL THEN 'Not Available' ELSE 'Available' END AS availability 

FROM availability a 

     cross join user u 

     LEFT JOIN user_availability ua 
     on u.user_id = ua.user_id 
     AND a.availability_id = ua.availability_id 
; 

sqlfiddle: http://www.sqlfiddle.com/#!2/626489/4

+0

Большое спасибо. Это делает именно то, что мне нужно. – turtlepower