You are asking for all records form all tables. So, If 1 person has 1 car
and 1 pet, there will be 2 records returned for that 1 person.

You'll need to use SUM() instead of COUNT():

SELECT people.*,
  SUM(IF(cars.id IS NULL,0,1)) AS car_count,
  SUM(IF(pets.id IS NULL,0,1)) AS pet_count,
....

Maybe?


On Sun, Nov 1, 2009 at 10:53 PM, Brian Dunning <br...@briandunning.com>wrote:

> Hi all -
>
> I have a table of PEOPLE, and a table of CARS owned by various people, and
> a table of PETS owned by various people. Each person may have 0 or more
> pets, and each person may have 0 or more cars. I'm trying to return a list
> of all the people, showing how many pets each person has, and how many cars
> each person has. Here's what I've got:
>
> SELECT
>        people.*,
>        count(cars.car_id) as car_count,
>        count(pets.pet_id) as pet_count
> FROM
>        (people
> LEFT OUTER JOIN
>        cars ON people.person_id = cars.person_id)
> LEFT OUTER JOIN
>        pets ON people.person_id = pets.person_id
> GROUP BY
>        people.person_id
> ORDER BY
>        people.name
>
> This is giving me an alphabetized list of all the people, but the car_count
> and pet_count that it's giving are only correct if either one of them is
> zero. If they both have a value, then both evaluate to the two correct
> values multiplied together (if Joe has 2 cars and 4 pets, it will say he has
> 8 cars and 8 pets).
>
> My brain is melting. What am I doing wrong?
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/mysql?unsub=joh...@pixelated.net
>
>


-- 
-----------------------------
Johnny Withers
601.209.4985
joh...@pixelated.net

Reply via email to