¿Cómo obtengo un recuento de filas asociadas en una combinación izquierda en MySQL?
Pregunta
Tengo dos tablas, una tabla vehículo
con columnas:
id
stock
year
make
model
y una tabla de imágenes
con columnas:
id
vehicle_id
name
caption
-
predeterminado tinyint (1)
Estoy intentando enumerar la información del vehículo, su imagen predeterminada y un recuento total de imágenes que tiene el vehículo. Actualmente estoy usando la siguiente declaración de 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
Inicialmente estaba usando:
ON vehicle.id = images.vehicle_id AND images.default = 1
pero entonces el recuento de imágenes solo sería 1 o 0 según si hubiera una imagen predeterminada en la base de datos. He intentado usar UNION
y otras declaraciones de SELECT
pero todavía no puedo obtener un resultado adecuado. ¿Debo usar dos declaraciones de SELECT
o hay otra manera de manejarlo con JOIN
o UNION
?
Solución
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`
Otros consejos
De la manera que sugiere el anser, obtienes valores repetidos de " vehículo " ;. Una mejor manera, es agrupar los resultados. Intenta sin el 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`
¡Déjame aclararlo para todos!
Tarea : imprime la tabla de 3 columnas:
- Vehículos (títulos) de la tabla vehículos .
- Cantidad de comentarios para cada vehículo de la tabla comentarios .
- Cantidad de imágenes para cada vehículo de la tabla imágenes .
Resultado esperado (solo un ejemplo) :
+----------------------+----------------+--------------+
| title | comments_count | images_count |
+----------------------+----------------+--------------+
| BMW X6 | 35 | 9 |
| Audi A6 | 3 | 5 |
| Volkswagen Passat B6 | 78 | 6 |
| Volkswagen Passat B5 | 129 | 4 |
+----------------------+----------------+--------------+
Solución :
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