2017-08-10 4 views
0

私はテーブルアドレスとテーブルルートを持っています。MySqlクエリ2レコードを1つの結果として返します

ルートストアの2つのIDとこれらのロケーション間の距離 - >idStartidEnddistance

+-------+-------+-----+--------+ 
|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 | 
+-------+-------+-------+--------+---------+------+------------+--------+ 

私はいくつかのサブクエリを行うと、特定のルートIDをouterquery場合、それは私ので、うまくいきます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'、あなたが2つのテーブルを持って書きましたが、クエリは3を持っている問題で、 'idEnd' – RealCheeseLord

+2

と一致します。 – Shadow

+0

これは重複した質問です。なぜなら、アドレステーブルを2度追加する必要があるからです。おそらく国のテーブルも2倍です。 – Shadow

答えて

1

ルートテーブルから2回、IDstartの場合は1回、IdEndの場合は1回だけ参加する必要があります。これは、テーブルエイリアスを使用することによって行われます。したがって、アドレステーブルを2回参照することができます。また、フィールドの結合または参照時に、データベースエンジンは、テーブルへの参照が使用/そこにも記載されている国のテーブルがあります:

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 
関連する問題