views:

251

answers:

1

I have two tables, a vehicle table with columns:

  • id
  • stock
  • year
  • make
  • model

and an images table with columns:

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

I am trying to list the vehicle's information, its default image, and a total count of images the vehicle has. Currently I am using the following SELECT statement:

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

I initially was using:

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

but then the images count would only be 1 or 0 depending if there was a default image in the database. I have tried using UNION and other SELECT statements but I am still unable to get a proper result. Do I need to use two SELECT statements or is there another way to handle it with JOIN or UNION?

+9  A: 
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`
chaos
I agree. This would be the correct way to do this. I can think of another way (involving using a subquery instead of the straight images table) but it is hacky and hideous (and just for fun). This is the right way to do this.
MBCook
+1 for this. I cleaned it up just a little for getting rid of the scroll
TheTXI
Is it better to use COUNT(id) instead of COUNT(*) so that I am not selecting all of the columns?
Cris McLaughlin
Makes no difference in this situation. In general, COUNT(*) should be used when what you mean is "how many rows". COUNT(id) means "how many ids that aren't null", which may or may not be a much more involved question.
chaos
if mysql supported CTE's i's post that solution
DForck42
I believe there are some performance benefits for using `COUNT(*)` instead of `COUNT(id)` when querying MyISAM tables, since I believe they store the total row count. However, this can probably only be used if you do not have any conditions in your query.
pr1001