我有两张表users
和distance
。在页面中,我需要使用简单查询列出所有用户,例如select * from users where active=1 order by id desc
。
有时我需要输出distance
表中的数据以及此查询,其中users
中的用户ID字段在两列中的distance
表中匹配,例如{ {1}}和userID_1
。同样在userID_2
表中,两个提到的列中的任何一个也必须匹配指定的id(distance
)以及where子句。
这是我提出的最好的:
$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
表中没有条目找到匹配的where子句,则查询根本不返回任何内容。如果没有匹配,我仍然希望它从distance
表返回行并返回user
为null。
我无法弄清楚我是否需要在这种情况下使用JOIN,UNION,SUBQUERY或其他任何东西。
感谢。
答案 0 :(得分: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注入攻击。
答案 1 :(得分: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
答案 2 :(得分:0)
您需要在'users'和'distance'之间进行左连接。结果(双关语无意),您将始终从'users'表中获取行与'distance'中的任何匹配行(如果有)。
我注意到您使用的是SQL-89连接语法(“隐式连接”)而不是SQL-92连接语法(“显式连接”)。我写了这篇once。
我建议您将查询更改为
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