我有两张桌子,一张 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,具体取决于数据库中是否有默认图像。我尝试过使用 UNION 和别的 SELECT 声明,但我仍然无法得到正确的结果。我需要使用两个吗 SELECT 语句或者有其他方法来处理它 JOIN 或者 UNION?

有帮助吗?

解决方案

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`

其他提示

按照回答者建议的方式,您会得到“车辆”的重复值。更好的方法是将结果分组。尝试不使用 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`

小编就给大家说清楚吧!

任务: :打印 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top