Search Postgresql Archives

Re: SQL Help: Multiple LEFT OUTER JOINs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxx



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux