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 ?

¿Fue útil?

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:

  1. Vehículos (títulos) de la tabla vehículos .
  2. Cantidad de comentarios para cada vehículo de la tabla comentarios .
  3. 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top