2017-02-13 3 views
0

, как я могу получить нулевое значение, если не существует в правильномполучить строки, которые имеют нулевое значение из таблицы справа

то, что я имею две таблицы один contract_type

ID | name  
    | 
1 | full-time 
2 | half-time 
3 | volunteer 
4 | freelancer 

и второй стол отношение между contract_type и работником
имя таблицы contract

ID |  employee_id | contract_type_id 
    |     | 
1 |   31   |  1 
2 |   31   |  2  
3 |   31   |  4  
4 |   45   |  3  

нет Wi нужен результат будет таким же, как contract_type таблицы с новыми столбцами, если существует справа или нет

Я попытался это

select * from contract_type left join `contract` on contract_type.ID = contract.contract_type_id where employee_id = 31 

теперь проблема является результатом только три записи, но я ожидать получить хотя бы что-то вроде

ID |  name  | contract_type_id 
    |     | 
1 |  full-time |  31 
2 |  half-time |  31   
3 |  volunteer |  null 
4 |  freelancer |  31 

или, может быть

ID |  name  |  status 
    |     | 
1 |  full-time |  true 
2 |  half-time |  true 
3 |  volunteer |  false 
4 |  freelancer |  true 
+0

Чтобы исправить запрос, просто переместить это условие из 'WHERE' положение в' ON' пункта. Что происходит, это условная проверка в предложении 'WHERE':' contract.employee_id = 31' исключает любые строки, которые имеют значение «NULL» для 'employee_id'. И это фактически отрицает «изящество» ЛЕВОЙ ВСТУПЛЕНИЯ. Подумайте об этом так: когда внешнее соединение не найдет подходящую строку, MySQL в основном «изобретает» строку для соответствия, поэтому операция объединения может быть удовлетворена, и строка может быть возвращена. И эта изобретенная строка целиком состоит из значений NULL. – spencer7593

ответ

2

Переместить чек ID в JOIN критериев вместо WHERE:

select * 
    from contract_type 
    left join `contract` on contract_type.ID = contract.contract_type_id 
    and employee_id = 31; 
+0

Правильно, у вас есть трюк, и я об этом не думал, большое вам спасибо – programmer

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