Mysql leftjoin问题用NULL

时间:2016-06-30 09:42:25

标签: mysql left-join

我一直在使用左连接,并发现它非常有用。今天我遇到了右侧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 2没有值。我使用category和scheme_category表编写了一个查询,以便 scheme_category 表显示为NULL:

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

但是此查询未将任何字段显示为NULL。请指导这方面。

2 个答案:

答案 0 :(得分:1)

问题是您只加入类别ID且类别ID匹配。您需要有一个完整的类别ID列表 - 期间对,并加入此列表中的scheme_category表。

您可以创建一个单独的期间表,在其中列出期间,或者从scheme_category表本身获取期间列表。然后在句点列表和类别ID之间创建一个笛卡尔连接,并在scheme_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    

答案 1 :(得分:-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

所以效果很好。