mysql连接查询左表中的null值

时间:2014-05-02 05:58:25

标签: php mysql sql jointable

我有以下表格

用户表

user_id   name   location_id  status_id 
1         test   1               1
2         john   NULL            1
3         royi   1               1
4         mahi   2               1

位置表

location_id   location_name   location_type  status_id 
1            US                  1               1
2            UK                  1               1
3            BR                  1               1
4            IN                  2               1

我想用location_id加入用户和位置表,并找到空记录。 我已经实现了以下查询,但它无法正常工作。

SELECT * 
FROM user u 
    left join location l 
        ON u.location_id = l.location_id 
WHERE 
    u.status_id = 1 
    and l.status_id = 1 
    and l.location_type = 1 
    or u.location_id IS NULL

我期待结果如

user_id   name   location_id  status_id location_id   location_name   location_type status_id 
1         test   1               1        1            US                  1               1
2         john   NULL            1        NULL          NULL              NULL             NULL  
3         royi   1               1        1            US                  1               1
4         mahi   2               1        2            UK                  1               1

当我将l.location_type更改为2时,预期结果如下

user_id   name   location_id  status_id location_id   location_name   location_type status_id 
2         john   NULL            1        NULL          NULL              NULL             NULL 

5 个答案:

答案 0 :(得分:1)

试试这个:

SELECT *
FROM user u 
    left join location l 
        ON u.location_id = l.location_id 
        and l.status_id = 1 
        and l.location_type = 1 
where 
    u.status_id = 1 

Here is the demo

您不需要使用u.location_id IS NULL,因为左连接不会排除用户,只会在匹配的位置添加用户的位置。

我看到您编辑了帖子并将john的status_id从2更改为1.当然,如果John状态ID为2,则查询永远无法检索到他(如果需要,请删除where u.status_id = 1

给我发表评论,如果预期输出错误,我会快速修复。

答案 1 :(得分:0)

我认为是因为这种情况u.status_id,我想你想写u.status ..

其他一切似乎都正确.. ^^

答案 2 :(得分:0)

由于在location_id的空记录中,l.status_id和l.location_type也将为null,因此查询不会输出。

你应该有。

SELECT * FROM user u 
left join location l ON u.location_id = l.location_id 
WHERE u.status_id = 1 
and ((l.status_id = 1 and l.location_type = 1) or u.location_id IS NULL)

只有当你把它们放在括号中时,OR子句才能正常运行并显示其中一个。

我建议这应该是您的查询。

答案 3 :(得分:0)

试试这个

SELECT * FROM user u left join location l ON u.location_id = l.location_id 

答案 4 :(得分:-1)

当您使用左连接意味着您希望来自用户的所有记录和位置表中的相应记录以及不存在具有空值的位置中的记录,您可以尝试以下查询:

SELECT u.*,l.* 
FROM user u 
left join location l 
ON u.location_id = l.location_id 
WHERE u.status_id = 1 and l.status_id = 1 and (l.location_type = 1 or u.location_id is null);