2017-08-10 77 views
0

我有一个表地址和一张桌子路线MySQL查询2条记录为1个结果

路线商店地址的两个ID和这些位置之间的距离 - >idStart,idEnd,distance

+-------+-------+-----+--------+ 
|idRoute|idStart|idEnd|distance| 
+-------+-------+-----+--------+ 
|0  |1  |3 |2698 | 
|1  |2  |4 |914  | 
+-------+-------|-----+--------+ 


+---------+---------+-------------+ 
|idAddress|country |city   | 
+---------+---------+-------------+ 
|0  |USA  |Indianapolis | 
|1  |Brasil |Rio   | 
|2  |Germany |Munich  | 
|3  |Argentina|Buenos Aires | 
|4  |Italy |Rome   | 
+---------+---------+-------------+ 

`

所以我想查询并得到所有路线如下:

+-------+-------+-------+--------+---------+------+------------+--------+ 
|idRoute|idStart|idEnd |CountryS|CountryE |CityS |CityE  |distance| 
+-------+-------+-------+--------+---------+------+------------+--------+ 
|0  |1  |3  |Brasil |Argentina|Rio |Buenos Aires|2698 | 
|1  |2  |4  |Germany |Italy |Munich|Rome  |914 | 
+-------+-------+-------+--------+---------+------+------------+--------+ 

如果我做了一些子查询和outerquery特定路由ID,它会因为我的工作有一个特定的其中id =#

 SELECT 
      ro.idRoute, 
      ro.idStart, 
      ro.idEnd, 
      ro.distance, 
      ro.time, 
      (select a.country from address a 
      left join route ro 
       on (a.idAddress=ro.idStart) 
      WHERE ro.idRoute='.$id .') as country_start, 
      (select a.country from address a 
      left join route ro 
       on (a.idAddress=ro.idEnd) 
      WHERE ro.idRoute='.$id .') as country_end, FROM route ro 
     LEFT JOIN address a ON (a.idAddress=ro.idStart) 
     LEFT JOIN countries c ON (a.country=c.code) 
     WHERE ro.idRoute='.$id . $this -> presetFilter . '; 

但在大多数情况下,我需要路由的所有记录,我不能得到这个工作因为对于子查询,我会错过where语句。

像外部查询 - >“set fieldname as outerResult”和使用outerResult在内部查询的语句?

+1

iguess'idAdress'与匹配'idStart'和'idEnd' – RealCheeseLord

+2

在你写的,你有2个表,但查询有3个问题:没有列出有作为一个国家的表。 – Shadow

+0

无论如何,这是一个重复的问题,因为你只需要加入地址表两次。也许这些国家的表现也是两倍。 – Shadow

回答

1

你只需要连接两次从路由表中寻址:一次为IDstart,一次为IdEnd。这是通过使用表别名来完成的,因此您可以参考地址表两次,并且在连接或引用字段时数据库引擎知道使用/需要对表引用哪些内容。

SELECT r.IdRoute 
    , r.idstart 
    , r.idend 
    , Start_Add.country as CountryS 
    , End_Add.country CountryE 
    , Start_Add.city as CityS 
    , End_Add.city as CityE 
    , r.distancce 
FROM route r 
INNER JOIN Address Start_Add 
on r.IDStart= Start_Add.IdAddress 
INNER JOIN address End_Add 
on r.IDEnd= End_Add.IdAddress