我有以下表格
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
答案 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
您不需要使用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);