2009-08-13 16 views
0

私は2つのテーブル:Vehicles(Id、VIN)とImages(Id、VehicleId、Name、Default)を持っています。私はテーブルに表示する車両のVINとそのデフォルトの画像を選択する必要があります。私が抱えている問題は、デフォルトのピクチャが設定されていない場合でも、それが存在する場合に表示するイメージを選択したいということです。画像が存在しない場合、車両情報も明らかに表示されなければならない。ここで私はこれまで持っているものです。MySQLの複雑なクエリが適切な結果をもたらさない

SELECT 
    Vehicles.Id, Vehicles.VIN, Images.Name AS Image, 
    (SELECT COUNT(*) FROM Images WHERE VehicleId = Vehicles.Id) AS ImageCount 
FROM 
    Vehicles 
LEFT JOIN 
    Images ON Images.VehicleId = Vehicles.Id 
WHERE 
    Images.Default = 1 

この文では、デフォルトのイメージを持っている車が表示されますが、デフォルトが設定されていない場合を表示しません。より良いここに私の問題を記述するために

は、いくつかのテストデータです:

VEHICLES: 
ID VIN 
1 12341234123412341 
2 23452345234523452 
3 34534534534534534 

IMAGES: 
ID VEHICLEID NAME DEFAULT 
1 1   a 1 
2 1   b 0 
3 2   c 0 
4 2   d 0 

車両2は、私はそれが表示する画像を選択したいデフォルトはありませんにもかかわらず。また、車両3には画像が全くありませんが、まだ画像がない状態でテーブルに表示する必要があります。車両1は設定されているため、デフォルト画像を表示します。私はこれが物事をクリアすることを願っています。デフォルトは1に設定されたという事実によって制限されたよう

+1

新しいものを作成しないでください。 – Brandon

+0

この重複した質問でここに答えるのではなく、オリジナルの質問に自分の答えを加えました。 –

+0

私はここで私の答えを追加し、今も他の質問にそれを貼り付けました:) –

答えて

0
SELECT 
    Vehicles.Id, Vehicles.VIN, Images.Name AS Image, 
    (SELECT COUNT(*) FROM Images WHERE VehicleId = Vehicles.Id) AS ImageCount 
FROM 
    Vehicles 
LEFT JOIN 
    Images ON Images.VehicleId = Vehicles.Id 
WHERE 
    1 

はトリックを行う必要があり、私は(あなたが探している、これはあなたの質問に答えると思いますが、あなたはwant-実際の結果のために洗練される必要があるかもしれません?画像の名前、または何を得るために)

0

OK、ここでの設定があります:私はIMAGESテーブルにDEFに列DEFAULTの名前を変更しなければならなかった

mysql> create table VEHICLES (ID INT PRIMARY KEY, VIN CHAR(17)); 
mysql> INSERT INTO VEHICLES (ID, VIN) VALUES(1, '12341234123412341'); 
mysql> INSERT INTO VEHICLES (ID, VIN) VALUES(2, '23452345234523452'); 
mysql> INSERT INTO VEHICLES (ID, VIN) VALUES(3, '34534534534534534'); 

注:

mysql> CREATE TABLE IMAGES (ID INT PRIMARY KEY, VEHICLEID INT, NAME VARCHAR(20), DEF INT); 
mysql> INSERT INTO IMAGES(ID, VEHICLEID, NAME, DEF) VALUES(1, 1, 'a', 1); 
mysql> INSERT INTO IMAGES(ID, VEHICLEID, NAME, DEF) VALUES(2, 1, 'b', 0); 
mysql> INSERT INTO IMAGES(ID, VEHICLEID, NAME, DEF) VALUES(3, 2, 'c', 0); 
mysql> INSERT INTO IMAGES(ID, VEHICLEID, NAME, DEF) VALUES(4, 2, 'd', 0); 

これが解決策です。

まず、車1台につき1つのイメージ行を取得するクエリが必要です。デフォルトのものが1つあればそれを選択します。

DEFの降順(1が上になるように)で画像をソートし、VEHICLEIDでグループ化して、1台の車両に1つの行しかないことを確認します。

mysql> SELECT * FROM (SELECT * FROM IMAGES ORDER BY DEF DESC) sortedimages GROUP BY VEHICLEID; 
+----+-----------+------+------+ 
| ID | VEHICLEID | NAME | DEF | 
+----+-----------+------+------+ 
| 1 |   1 | a | 1 | 
| 3 |   2 | c | 0 | 
+----+-----------+------+------+ 

は、今、私たちはVEHICLESテーブルから選択して、上記のクエリにLEFT OUTER JOINは、我々は常に車両ごとに1つの行を取得することを確認するために:あなたは、追加の情報を追加するには、古い質問を編集している必要があります

mysql> SELECT * FROM VEHICLES LEFT OUTER JOIN (SELECT * FROM (SELECT * FROM IMAGES ORDER BY DEF DESC) sortedimages GROUP BY VEHICLEID) defaultimages ON VEHICLES.ID = defaultimages.VEHICLEID; 
+----+-------------------+------+-----------+------+------+ 
| ID | VIN    | ID | VEHICLEID | NAME | DEF | 
+----+-------------------+------+-----------+------+------+ 
| 1 | 12341234123412341 | 1 |   1 | a | 1 | 
| 2 | 23452345234523452 | 3 |   2 | c | 0 | 
| 3 | 34534534534534534 | NULL |  NULL | NULL | NULL | 
+----+-------------------+------+-----------+------+------+ 
+0

どこでb.VEHICLEIDを取得しましたか? –

+0

私はそれをより読みやすくしようとする前に、私が使用していた名前は申し訳ありません。今修正:defaultimages.VEHICLEIDだったはずです。 –

関連する問題