Re: SQL Help: Multiple LEFT OUTER JOINs - Mailing list pgsql-general
From | Bill Moseley |
---|---|
Subject | Re: SQL Help: Multiple LEFT OUTER JOINs |
Date | |
Msg-id | 20051121220634.GC30095@hank.org Whole thread Raw |
In response to | Re: SQL Help: Multiple LEFT OUTER JOINs (John McCawley <nospam@hardgeus.com>) |
Responses |
Re: SQL Help: Multiple LEFT OUTER JOINs
|
List | pgsql-general |
On Mon, Nov 21, 2005 at 03:25:56PM -0600, John McCawley wrote: > I just noticed, also goofy is your ", person_role" in your from with no > criteria. I would generally put the "person_role.person = person.id" as > an INNER JOIN, and then only have the "person_role.role=3" in the > where. It doesn't look like that's the specific problem, but I > generally find that kind of mixed syntax muddles a query. I need to read more about the FROM clause, as I can't seem to get what you are suggesting. The now working query (thanks to you!) is: SELECT person.id AS id, first_name, last_name, count(instructors.class) as total_classes, -- sum (CASE WHEN class.id IS NULL THEN 0 ELSE 1 END) as total_class_count, sum (CASE WHEN class_time > now() THEN 1 ELSE 0 END) as future_class_count, sum (CASE WHEN class_time <= now() THEN 1 ELSE 0 END) as past_class_count FROM class INNER JOIN instructors ON class.id = instructors.class LEFT OUTER JOIN person ON person.id = instructors.person, person_role WHERE person_role.person = person.id AND person_role.role = 2 GROUP BY person.id, first_name, last_name ORDER BY future_class_count; Not sure how to construct that. Not this, as it returns odd counts SELECT person.id AS id, count(instructors.class) as total_classes, sum (CASE WHEN class.id IS NULL THEN 0 ELSE 1 END) as total_class_count, -- which is better? sum (CASE WHEN class_time > now() THEN 1 ELSE 0 END) as future_class_count, sum (CASE WHEN class_time <= now() THEN 1 ELSE 0 END) as past_class_count FROM class INNER JOIN instructors ON class.id = instructors.class LEFT OUTER JOIN person ON person.id = instructors.person INNER JOIN person_role ON person_role.person = person.id WHERE person_role.role = 2 GROUP BY person.id, first_name, last_name ORDER BY total_classes; id | total_classes | total_class_count | future_class_count | past_class_count -----+---------------+-------------------+--------------------+------------------ 90 | 1 | 1 | 0 | 1 98 | 1 | 1 | 0 | 1 92 | 1 | 1 | 0 | 1 123 | 1 | 1 | 0 | 1 122 | 1 | 1 | 0 | 1 121 | 2 | 2 | 0 | 2 66 | 2 | 2 | 0 | 2 74 | 2 | 2 | 0 | 2 56 | 2 | 2 | 0 | 2 85 | 2 | 2 | 0 | 2 119 | 2 | 2 | 0 | 2 41 | 2 | 2 | 0 | 2 33 | 2 | 2 | 0 | 2 65 | 2 | 2 | 0 | 2 105 | 3 | 3 | 0 | 3 83 | 3 | 3 | 0 | 3 102 | 3 | 3 | 0 | 3 32 | 4 | 4 | 0 | 4 71 | 4 | 4 | 0 | 4 70 | 4 | 4 | 0 | 4 14 | 4 | 4 | 0 | 4 29 | 4 | 4 | 0 | 4 77 | 4 | 4 | 0 | 4 86 | 4 | 4 | 0 | 4 50 | 4 | 4 | 0 | 4 107 | 4 | 4 | 0 | 4 8 | 4 | 4 | 0 | 4 114 | 4 | 4 | 0 | 4 42 | 4 | 4 | 0 | 4 82 | 4 | 4 | 0 | 4 28 | 4 | 4 | 0 | 4 17 | 4 | 4 | 0 | 4 52 | 4 | 4 | 0 | 4 9 | 4 | 4 | 0 | 4 31 | 4 | 4 | 0 | 4 -- Bill Moseley moseley@hank.org
pgsql-general by date: