2012-01-13 20 views
1

私は複数のテーブル(剥離概要)のセットを有する:MySQL:複数の選択、複数の結合?

Brand; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id     | tinyint(10) | NO | PRI | NULL |  | 
| name    | varchar(255) | NO |  | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

Relations; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id1    | tinyint(10) | NO | PRI | NULL |  | 
| id2    | tinyint(10) | NO | PRI | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

Country; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id     | tinyint(10) | NO | PRI | NULL |  | 
| name    | varchar(255) | NO |  | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

City; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id     | tinyint(10) | NO | PRI | NULL |  | 
| name    | varchar(255) | NO |  | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

各行は、一意のIDを有しています。ブランド表の各行は、国と都市との関係を持っています。これらの表の関係はリレーション表に格納されているため、各ブランド行のリレーション表には2つの行があります。

特定のブランドIDのブランド名、国名、都市名を取得しようとしています。私は個々の選択肢によってこれらの関係を選択することができますが、私の目標は(可能であれば)単一のクエリでそれを行うことです。

私は関係(国)のいずれかを取得することができるが、私は同様に街を取得したい:

SELECT Brand.name as brand, Country.name as country 
FROM Brand 
LEFT JOIN _relations 
ON Relations.id1 = Brand.id 
INNER JOIN Country 
ON Country.id = Relations.id2 
WHERE Brand.id = '123456'; 

結果:

を:

+-----------+-------------+ 
| brand  | country  | 
+-----------+-------------+ 
| brandname | countryname | 
+-----------+-------------+ 

私の目標は、取得することです

+-----------+-------------+-------------+ 
| brand  | country  | city  | 
+-----------+-------------+-------------+ 
| brandname | countryname | cityname | 
+-----------+-------------+-------------+ 

誰でも私にこれを助けたり、正しい方向に私を指摘できますか?

答えて

0

別のエイリアスの下でもう一度Join Joinテーブル。

このような何か:

SELECT Brand.name as brand, Country.name as country, City.name as city 
FROM Brand 
LEFT JOIN Relations ON Relations.id1 = Brand.id 
INNER JOIN Country ON Country.id = Relations.id2 
LEFT JOIN Relations r2 ON r2.id1 = Brand.id 
LEFT JOIN City ON City.id = r2.id2 
WHERE Brand.id = '123456'; 
0

基本的にあなたが再び関係に参加して、市を取得するためにそれを使用するので、

SELECT Brand.name as brand, Country.name as country, City.Name as City 
FROM Brand 
LEFT JOIN _relations relCountry 
ON relCountry.id1 = Brand.id 
INNER JOIN Country 
ON Country.id = relCountry.id2 
LEFT JOIN _relations relCity 
ON relCity.id1 = Brand.id 
INNER JOIN City 
ON City.id = relCity.id2 
+0

グレートのようなものは、それは完璧なソリューションでした、ありがとうございました。しかし、私は新しい問題に遭遇しました。ブランドに都市が存在しない場合はどうなりますか?リレーションテーブルに都市IDが見つからない場合は、0行が返されるようになりました。ジョインを無視し、Cityフィールドのnullまたはおそらくカスタム値を返す方法はありますか?結果の代わりに、ブランド名、国名、空の都市フィールドを取得したいと思います。 – Tod

+0

内側の代わりに外側の結合。 –

関連する問題