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');
注意,我不得不在图像表中的列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);
这就是解决方案。
首先,我们需要一个查询,每个车辆获取一个图像行,如果有一个,选择默认值。
我们通过按照DEF的降序对图像进行排序(所以1位于顶部),然后按VEHICLEID
进行分组,以确保每辆车只有一排。
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
上述查询,以确保我们始终每辆车得到一个行:
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 |
+----+-------------------+------+-----------+------+------+
你应该已经编辑了自己的老问题补充附加信息,而不是创建一个新的。 – Brandon 2009-08-13 19:45:24
我已经添加到我对原始问题的回答中,而不是在这里重复回答这个问题。 – 2009-08-13 20:07:05
我在这里首先添加了我的答案,现在又粘贴了其他问题:) – 2009-08-13 20:13:09