21

我有两张表,一张vehicle有列的表:

  • id
  • stock
  • year
  • make
  • model

和一个images有列的表:

  • id
  • vehicle_id
  • name
  • caption
  • default tinyint(1)

我正在尝试列出车辆的信息、其默认图像以及车辆拥有的图像总数。目前我正在使用以下SELECT语句:

SELECT vehicle.id, vehicle.stock, vehicle.year,
    vehicle.make, vehicle.model, images.name,
    COUNT(images.id)
FROM vehicle
LEFT JOIN images
ON vehicle.id = images.vehicle_id

我最初使用的是:

ON vehicle.id = images.vehicle_id AND images.default = 1

但随后图像计数将仅为 1 或 0,具体取决于数据库中是否存在默认图像。我已经尝试过 usingUNION和其他SELECT语句,但我仍然无法得到正确的结果。我需要使用两个SELECT语句还是有另一种方法来处理它JOINUNION

4

3 回答 3

42
SELECT 
    `vehicle`.`id`, 
    `vehicle`.`stock`, 
    `vehicle`.`year`, 
    `vehicle`.`make`, 
    `vehicle`.`model`, 
    `images`.`name`,
    (
        SELECT COUNT(*) 
        FROM `images` 
        WHERE `vehicle_id` = `vehicle`.`id`
    ) AS `image_count`
FROM `vehicle`
LEFT JOIN `images`
ON `images`.`vehicle_id` = `vehicle`.`id`
WHERE `images`.`default`
于 2009-04-30T18:50:29.297 回答
6

以分析器建议的方式,您会得到“车辆”的重复值。更好的方法是将结果分组。尝试不使用 JOIN :

SELECT 
    `vehicle`.`id`, 
    `vehicle`.`stock`, 
    `vehicle`.`year`, 
    `vehicle`.`make`, 
    `vehicle`.`model`, 
    `images`.`name`,
    (
        SELECT COUNT(*) 
        FROM `images` 
        WHERE `vehicle_id` = `vehicle`.`id`
    ) AS `image_count`
FROM `vehicle`

WHERE `images`.`default`
于 2013-10-08T09:52:50.307 回答
4

让我为大家说清楚!

任务:打印 3 列表格:

  1. 车辆表中的车辆(标题)。
  2. 评论表中每辆车的评论数量。
  3. 图像表中每辆车的图像数量。

预期输出(只是一个例子)

+----------------------+----------------+--------------+
|        title         | comments_count | images_count |
+----------------------+----------------+--------------+
| BMW X6               |             35 |            9 |
| Audi A6              |              3 |            5 |
| Volkswagen Passat B6 |             78 |            6 |
| Volkswagen Passat B5 |            129 |            4 |
+----------------------+----------------+--------------+

解决方案

SELECT 
    vehicles.title,
    (SELECT COUNT(*) FROM comments WHERE vehicles.id = comments.vehicle_id) AS comments_count,
    (SELECT COUNT(*) FROM images WHERE vehicles.id = images.vehicle_id) AS images_count
FROM vehicles
于 2017-08-13T17:01:34.323 回答