我有3张桌子。
表1 - 驱动程序
表2 - 位置
表3 - 距离
用户将搜索与位置匹配的驱动程序。在驱动程序表中,该位置指的是驱动程序的当前位置。如果某个驱动程序在特定位置不可用,我想要一个查询来搜索最接近用户所提供位置的驱动程序。
表2是位置名称,表3是从一个地方到另一个地方的距离。但问题是,如果存储了从locationid 1到locationid 2的距离,则不存在相反的版本(locationid 2到locationid 1)。
答案 0 :(得分:3)
这不是直截了当的。
首先,您需要获取给定位置与之关系的所有位置。此结果包含locationid
和distance
。
与位置本身的距离为零。我已获得UNION ALL
的帮助,以便列出<locationid,distance>
。
然后在上面的列表和匹配INNER JOIN
的{{1}}表格之间设置drivers
。
最后按升序对location
的结果集进行排序。
distance
OR
注意:您可以加入SELECT
*
FROM drivers DR
INNER JOIN
(
SELECT
locationid,
0 AS distance
FROM location
WHERE locationname = 'Gulshan'
UNION ALL
SELECT
IF(L.locationid = D.fromid, D.toid, D.fromid),
D.distance
FROM location L
INNER JOIN distance D ON L.locationid IN (D.fromid,D.toid)
WHERE locationname = 'Gulshan'
) AS t
ON DR.location = t.locationid
ORDER BY t.distance
,以限制包含最多LIMIT n
个搜索结果的结果集。
您还可以在查询中加入n
,以便最终结果具有某种意义。