2009-04-30 26 views
10

Tengo dos tablas, una mesa con columnas vehicle:¿Cómo obtengo un recuento de filas asociadas en una combinación a la izquierda en MySQL?

  • id
  • stock
  • year
  • make
  • model

y un images tabla con columnas:

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

Estoy tratando de enumerar su imagen por defecto la información del vehículo, y un total recuento de imágenes que tiene el vehículo. Actualmente estoy usando el SELECT declaración siguiente:

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 

que inicialmente estaba usando:

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

pero luego las imágenes cuentan sólo sería 1 o 0 dependiendo de si había una imagen por defecto en la base de datos. He intentado usar UNION y otras declaraciones SELECT, pero todavía no puedo obtener un resultado correcto. ¿Debo utilizar dos declaraciones SELECT o hay otra forma de manejarlo con JOIN o UNION?

Respuesta

23
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` 
+0

estoy de acuerdo. Esta sería la forma correcta de hacer esto. Puedo pensar en otra forma (que implica el uso de una subconsulta en lugar de la tabla de imágenes rectas), pero es hacky y horrible (y solo por diversión). Esta es la forma correcta de hacer esto. – MBCook

+0

+1 para esto. Lo limpié solo un poco para deshacerme del scroll – TheTXI

+0

¿Es mejor usar COUNT (id) en lugar de COUNT (*) para no seleccionar todas las columnas? –

5

En la forma en que sugiere el mensaje, obtiene valores repetidos de "vehículo". Una mejor forma es agrupar los resultados. Pruebe sin 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` 
+0

Esta es mejor que la respuesta aceptada, @giuseppe intenta editar la respuesta aceptada, quizás el autor la cambie –

1

¡Déjenme dejarlo en claro para todos!

Tarea: Imprimir 3 columnas tabla:

  1. Vehículos (títulos) de los vehículos mesa.
  2. Cantidad de comentarios para cada vehículo desde comentarios tabla.
  3. Cantidad de imágenes para cada vehículo desde imágenes mesa.

Resultados previstos (es 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 
Cuestiones relacionadas