Mysql选择记录where子句

时间:2015-03-27 06:59:36

标签: mysql

我有下表

用户

  • 用户ID
  • LocationId

位置

  • 用户ID
  • LocationId
  • CityId

两个表都包含其他一些字段。我有以下查询

SELECT * FROM users where LocationId in (Select LocationId from locations where UserId = 118);

此查询返回我在users表中存在的记录中没有记录,其中locationid存在于位置表中。我想要的如果此时此查询Select LocationId from locations where UserId = 118找不到任何记录,我想显示用户表中的所有记录。现在,如果没有任何位置,它将返回0记录。

3 个答案:

答案 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 joinlocation.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