2016-06-30 3 views
-1

Я использовал левое соединение и нашел его полезным. Сегодня я столкнулся с проблемой, когда правая сторона NULL не отображается. Первая таблица категории, которая, как показано ниже:Mysql leftjoin issue with NULL

id name 
1  ROR 
2 Mutation 
3 Partition 

Вторая таблица scheme_category, который, как показано ниже:

id scheme_id category_id period 
1  12    1   3/2016 
2  12    2   3/2016 
3  12    1   4/2016 
4  12    2   4/2016 
5  12    3   4/2016 
6  12    1   5/2016 
7  12    3   5/2016 

За период 3/2016, никакого значения не существует для category_id 3. Аналогично , за период 5/2016, для category_id нет значения. Я написал запрос с использованием категории и таблицы schem_category, так что несуществующие категории в таблице schem_category показаны как NULL:

select category.name, period 
from category 
    left join scheme_category on category.id= scheme_category.category_id 

Но этот запрос не показывает никаких полей как NULL. В этом отношении следует руководствоваться.

+1

Это верно, потому что в вашей таблице schem_category содержатся все значения различных категорий, которые пытаются вставить новое значение в категорию, тогда вы получите нулевую запись. –

+1

. Этот запрос, очевидно, не показывал никаких полей как «NULL» для ваших данных образца. – Blank

+0

Пожалуйста, попробуйте этот запрос для вашего решения: 'выберите category.name, период, category_id из категории оставил присоединиться scheme_category на category.id = scheme_category.category_id' –

ответ

1

Проблема в том, что вы присоединяетесь только к идентификатору категории и соответствуют идентификаторам категорий. Вам необходимо иметь полный список пар идентификаторов категории - и присоединиться к таблице schem_category в этом списке.

Либо вы создадите отдельную таблицу периодов, в которой вы указываете периоды, либо получаете список периодов из самой таблицы schem_category. Затем создайте декартовое соединение между списком периодов и идентификаторами категории и левой частью этого набора данных в таблице schem_category.

Поскольку второй вариант является более сложным, я приведу пример кода для этого:

select 
from 
    (select distinct period from scheme_category) t1 
join 
    category --note that there is no join condition -> creating a Cartesian join 
left join 
    scheme_category on t1.period=scheme_category.period and category.id=scheme_category.category_id  
+0

Спасибо тень за вашу помощь. Я приму свой ответ. – John

-1

Я создал в PhpMyAdmin две таблицы, подобные вашим. Мой запрос выглядит следующим образом:

SELECT category.name, scheme_category.peroid 
FROM `scheme_category` 
LEFT JOIN category 
ON category.id = scheme_category.category_id 

... и это дает мне:

name | peroid 
ROR | 3/2016 
Mutation | 3/2016 
ROR |4/2016 

Так хорошо работает.

+0

Вопрос в том, почему OP не видит нулевые значения, которые они ожидают, а не работает ли запрос. –