OK、セットアップは次のとおりです。
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' );
IMAGES テーブルの列の名前を次のように変更する必要があったことに注意してDEFAULT
ください。DEF
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 つの画像行を取得するクエリが必要です。存在する場合は、既定の画像を選択します。
これは、DEF の降順で画像を並べ替え (1 が一番上になるように)、VEHICLEID
車両ごとに 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 |
+----+-------------------+------+-----------+------+------+