如何在MySQL的左连接中获取关联行的计数?

Cri*_*lin 14 mysql sql select join subquery

我有两个表,一个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
Run Code Online (Sandbox Code Playgroud)

我最初使用的是:

ON vehicle.id = images.vehicle_id AND images.default = 1
Run Code Online (Sandbox Code Playgroud)

但是,如果数据库中存在默认图像,则图像计数将仅为1或0.我尝试过使用UNION和其他SELECT语句,但我仍然无法得到正确的结果.我需要用两个SELECT语句或有另一种方式与处理呢JOIN还是UNION

cha*_*aos 32

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`
Run Code Online (Sandbox Code Playgroud)


giu*_*ppe 5

在anser建议的方式中,你得到重复的"车辆"值.更好的方法是对结果进行分组.尝试没有加入:

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`
Run Code Online (Sandbox Code Playgroud)


Eri*_*kas 5

小编就给大家说清楚吧!

任务:打印 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 |
+----------------------+----------------+--------------+
Run Code Online (Sandbox Code Playgroud)

解决方案

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
Run Code Online (Sandbox Code Playgroud)