2009-08-13 102 views
0

我有两个表:车辆(Id,VIN)和图像(Id,VehicleId,名称,默认)。我需要选择车辆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

你应该已经编辑了自己的老问题补充附加信息,而不是创建一个新的。 – Brandon 2009-08-13 19:45:24

+0

我已经添加到我对原始问题的回答中,而不是在这里重复回答这个问题。 – 2009-08-13 20:07:05

+0

我在这里首先添加了我的答案,现在又粘贴了其他问题:) – 2009-08-13 20:13:09

回答

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 

应该做的伎俩,因为你是通过默认设置为1。我觉得这个回答你的问题的事实限制,但可能需要改进你want-实际结果(你找谁?将获取图像,或者是什么的名称)

0

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

你从哪里得到b.VEHICLEID? – 2009-08-13 20:28:00

+0

对不起,这是我之前使用的名称,我试图使其更具可读性。现在修复:应该是defaultimages.VEHICLEID。 – 2009-08-14 08:25:35