On Wed, 5 Dec 2001, Roberto Mello wrote:
> On Wed, Dec 05, 2001 at 01:07:20PM -0800, Stephan Szabo wrote:
> > >
> > > SELECT COUNT(incident_id), drug_name, grade_name
> > > FROM sds_offenders o, sds_drugs d, sds_drug_offenses do, sds_grades g
> > > WHERE o.drug_p = 't'
> > > AND o.offender_id = do.offender_id
> > > AND d.drug_id = do.drug_id
> > > GROUP BY drug_name, grade_name, d.sort_key
> > > ORDER BY d.sort_key
> >
> > I think you need a
> > g.gradeid=o.gradeid
> > in the where clause as well to constrain g to
> > the grade for which the offender belonged, right?
>
> Yes, I figured this mistake minutes after sending the message to the list.
> The problem is that with g.grade_id = o.grade_id there it gives me _only_
> the grades that have incidents in them, instead of _all_ the grades with
> 0's for those without incidents.
Right, then you will want an outer join, probably something like:
select count(incident_id), drug_name, grade_name
from
((sds_offenders o inner join sds_drug_offenses dro using (offender_id)) inner join sds_drugs d using (drug_id)) right
joinsds_grades using (grade_id)
where o.drug_p='t'
group by drug_name, grade_name, d.sort_key
order by d.sort_key;