MySQL复杂查询没有产生正确的结果

时间:2009-08-13 19:43:34

标签: mysql left-join

我有两个表:车辆(Id,VIN)和图像(Id,VehicleId,名称,默认)。我需要选择车辆VIN及其默认图片以显示在表格中。我遇到的问题是,如果未设置默认图片,我仍然希望选择要显示的图像(如果存在)。如果不存在图像,则显然还必须显示车辆信息。以下是我到目前为止的情况:

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将显示其默认图像,因为它已设置。我希望这能解决问题。

2 个答案:

答案 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

应该这样做,因为你限制了默认设置为1的事实。我认为这可以回答你的问题,但可能需要根据你想要的实际结果进行改进 - (你是否希望得到这个名字)图像,或什么?)

答案 1 :(得分:0)

好的,这是设置:

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 );

这是解决方案。

首先,我们需要一个查询,每个车辆获得一个图像行,如果有,则选择默认值。

我们通过按DEF的降序排序图像(所以1s位于顶部),然后按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 | 
+----+-------------------+------+-----------+------+------+