我有下表
用户
位置
两个表都包含其他一些字段。我有以下查询
SELECT * FROM users where LocationId in (Select LocationId from locations where UserId = 118);
此查询返回我在users
表中存在的记录中没有记录,其中locationid存在于位置表中。我想要的如果此时此查询Select LocationId from locations where UserId = 118
找不到任何记录,我想显示用户表中的所有记录。现在,如果没有任何位置,它将返回0记录。
答案 0 :(得分:5)
尝试此查询
select * from users u left join locations l on u.LocationId = l.LocationId and u.UserId = 118
它将返回用户的所有记录,尽管从UserID = 118
的用户表中找不到匹配的记录答案 1 :(得分:0)
根据问题中的要求
我想要的内容如果此查询找不到任何记录,请选择 LocationId来自我想要的UserId = 118的位置 显示用户表中的所有记录
您可以将left join
与location.UserId=118
一起使用其他加入条件但是在这种情况下,它还会返回不匹配的记录,换句话说就是完整的用户表。
所以有条件 - 如果在位置表中找到userid,则仅返回该用户数据 - 否则所有用户数据
最好的方法是创建一个存储过程
delimiter //
create procedure find_user_location_based(in user_id int)
begin
if (select 1 from locations where UserId = user_id ) then
begin
SELECT * FROM users where UserId = user_id ;
end;
else
begin
SELECT * FROM users;
end;
end if;
end;//
delimiter ;
然后将用户ID作为
传递给过程call find_user_location_based(118);
答案 2 :(得分:-1)
当您使用SELECT * FROM users where LocationId in (Select LocationId from locations where UserId = 118)
时,它作为inner join
使用
这就是为什么它返回0条记录而不匹配两个表中的记录。
并且您希望从至少一个表返回记录,因此您必须使用LEFT / RIGHT Join
尝试像这样的左连接
SELECT u.* FROM users u left join locations l on
u.LocationId=l.LocationId and l.UserId=118