1

我有两张桌子usersdistance. 在一个页面中,我需要使用一个简单的查询来列出所有用户,例如select * from users where active=1 order by id desc.

有时我需要从distance表中输出数据以及此查询,其中用户 ID 字段在表中的两列users中的任何一个中匹配,例如和。同样在表中,提到的两个列中的任何一个也必须与where 子句中的指定 id ( ) 匹配。distanceuserID_1userID_2distance$userID

这是我想出的最好的:

select 
    a.*,
    b.distance 
from 
    users a,
    distance b 
where 
    ((b.userID_1='$userID' and a.id=b.userID_2) 
  or (a.id=b.userID_1 and b.userID_2='$userID')) 
 and a.active=1 
order by a.id desc

此查询的唯一问题是,如果distance表中没有用于 where 子句查找匹配项的条目,则查询根本不会返回任何内容。我仍然希望它从user表中返回行,distance如果没有匹配项则返回 null。

我不知道在这种情况下是否需要使用 JOIN、UNION、SUBQUERY 或其他任何东西。

谢谢。

4

3 回答 3

1

使用左连接

select 
    a.*,
    b.distance 
from 
    users a
    left join distance b on
       (b.userID_1=? and a.id=b.userID_2) 
    or (b.userID_2=? and a.id=b.userID_1)
where 
    a.active=1 
order by a.id desc

并使用准备好的语句。将文本替换到查询中容易受到 SQL 注入攻击。

于 2013-09-07T03:52:40.330 回答
0

您需要“用户”和“距离”之间的左连接。结果(双关语不是有意的),您将始终从“用户”表中获取行以及来自“距离”的任何匹配行(如果有)。

我注意到您使用的是 SQL-89 连接语法(“隐式连接”),而不是 SQL-92 连接语法(“显式连接”)。我写过一次

我建议您将查询更改为

select a.*, b.distance 
from users a left join distance b 
on ((b.userID_1='$userID' and a.id=b.userID_2) 
or (a.id=b.userID_1 and b.userID_2='$userID')) 
where a.active=1 
order by a.id desc
于 2013-09-07T03:54:53.713 回答
0

尝试这个:

select a.*, b.distance 
from users a 
left join distance b on (a.id=b.userID_1 or a.id=b.userID_2) and 
                        (b.userID_1 = '$userID' or b.userID_2 = '$userID') 
where a.active=1 
order by a.id desc 
于 2013-09-07T03:52:31.513 回答