不确定如何使用两个表的mySQL查询来解决这个问题

时间:2013-09-07 03:42:52

标签: mysql sql

我有两张表usersdistance。在页面中,我需要使用简单查询列出所有用户,例如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或其他任何东西。

感谢。

3 个答案:

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