2016-05-27 76 views
0

我有以下表格:MYSQL:由两个外键从同一个表中选择

航班: ID,idcompany,idplane,fromCity,toCity,起飞......

公司: ID,名称

面: ID,名称

城市: ID,名称

我想在同一个查询中声明两个城市的名称“fromCity,toCity”。

我的这个行动的目的是一次获得城市名称,所以我可以将它们展示给客户端,而不需要做另一个查询来获取城市名称。

这里是我的尝试:

SELECT f.id, f.takeoff, f.arrival, ct.name as fromCity, f.toCity, c.name as company, p.name as plane 
FROM flights f, companies c, planes p, cities ct 
WHERE f.idCompany = c.id AND f.idPlane = p.id AND f.fromCity = ct.id 
ORDER BY f.takeoff ASC 

此查询将返回“fromCity”,但“toCity”的id的名字,所以我能做些什么用相同的查询,以获得两个名字?

+0

添加一些示例表数据,目前的结果和预期的结果。 – jarlh

回答

2

您可以使用此:

SELECT 
    f.id, f.takeoff, f.arrival, ct1.name as fromCity 
    ,ct2.name as toCity, c.name as company, p.name as plane 
FROM 
    flights f 
inner join 
    companies c 
on 
    f.idCompany = c.id 
inner join 
    planes p 
on 
    f.idPlane = p.id 
inner join 
    cities ct1 
on 
    f.fromCity = ct1.id 
inner join 
    cities ct2 
on 
    f.toCity = ct2.id 
ORDER BY 
    f.takeoff ASC; 

并尝试不使用old-style-join从现在开始。

+0

三个答案都是权利,现在哪一个具有最高的性能? – Mohammad

+2

@Mhamhammad,相同的性能,只有不同的语法版本。 – jarlh

1

你必须加入表格两次。

SELECT f.id, f.takeoff, f.arrival, ct.name as fromCity, f.toCity, c.name as company, p.name as plane , cf.name 
FROM flights f, companies c, planes p, cities ct,cities cf 
WHERE f.idCompany = c.id AND f.idPlane = p.id AND f.fromCity = ct.id AND f.toCity = cf.id 
ORDER BY f.takeoff ASC 
0

我的解决方案是使表城市的两个副本:

SELECT f.id, f.takeoff, f.arrival, ct1.name as fromCity, ct2.name as toCity, c.name as company, p.name as plane 

FROM flights f, companies c, planes p, cities ct1, cities ct2 

WHERE f.idCompany = c.id AND f.idPlane = p.id AND f.fromCity = ct1.id AND ct2.id = f.toCity 

ORDER BY f.takeoff ASC 
+0

几乎与Pham X.巴赫的答案一样,但仍然与旧式,隐式联接... – jarlh

+1

@jarlh是啊对,所以我会接受Pham X.巴赫的答案 – Mohammad