Martin, you are correct in how you determine when to use AND and when to
use OR, but that's not what the original query was trying to find.... If
you re-read his original post, he wants this query:
SELECT Applicants.AppID,
Applicants.Name,
Applicants.Email
FROM ApplicantStatus
INNER JOIN Applicants
ON Applicants.AppID = ApplicantStatus.AppID
WHERE ApplicantStatus.Active = 1
AND ApplicantStatus.SCode = '####';
with two additional columns containing information from the "reviews"
table. BUT! he only wants those columns populated if the reviewer was
reviewer #2. That's why Harald's answer is correct.
To repeat Harald's answer:
SELECT Applicants.AppID, Applicants.Name, Applicants.Email,
Reviews.Quant, Reviews.Qual
FROM ApplicantStatus
INNER JOIN Applicants ON Applicants.AppID = ApplicantStatus.AppID
LEFT JOIN Reviews ON Reviews.AppID = Applicants.AppID
AND ReviewerID = 2
WHERE ApplicantStatus.Active = 1
AND ApplicantStatus.SCode = '####';
With the ReviewerID condition into the ON clause of the LEFT JOIN (and not
as a condition in the WHERE clause), the query will not join ANY row from
"reviews" for ANY OTHER reviewer except #2. Good call Harald!
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine
"Martin Gainty" <[EMAIL PROTECTED]> wrote on 10/13/2004 10:13:46 AM:
> A SQL AND is a restrictive filter
> In other words
> Your resultset will yield results based on how you structure your query
> If you structure your resultset which includes only applicants who have
been
> seen by "Reviewer2" then state
> SELECT ... FROM
> WHERE (CONDITION1 AND Applicant.Reviewer = 'Reviewer2')
> If you want applicants which includes ALL reviewers INCLUDING those who
have
> been seen by Reviewer2
> SELECT ... FROM
> WHERE (CONDITION1 OR Applicant Reviewer='Reviewer2')
> HTH,
> Martin
> To some extent.. sanity is a form of conformity..
> ~John Nash PhD~
> ----- Original Message -----
> From: "Harald Fuchs" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Wednesday, October 13, 2004 8:37 AM
> Subject: Re: Q: outer join w/restriction
>
>
> > In article
>
<[EMAIL PROTECTED]>,
> > "Christopher J. Mackie" <[EMAIL PROTECTED]> writes:
> >
> > > There's something I'm not getting about how to put a SELECT
restriction
> on a query with an outer join. The following query:
> > > SELECT Applicants.AppID, Applicants.Name, Applicants.Email,
> > > Reviews.Quant, Reviews.Qual
> > > FROM ApplicantStatus
> > > INNER JOIN Applicants ON Applicants.AppID = ApplicantStatus.AppID
> > > LEFT JOIN Reviews ON Reviews.AppID = Applicants.AppID
> > > WHERE ApplicantStatus.Active = 1
> > > AND ApplicantStatus.SCode = '####'
> >
> > > AND C.Reviewer.ID = 2;
> >
> > > returns only Applicants who have reviews from Reviewer # 2. What I
want
> is *all* applicants who meet the other two criteria (Active, and SCode
> =...), and *any* reviews by Reviewer 2 for any of those applicants (if
> Reviewer 2 hasn't written for Applicant a, then a should still be in the
> result set, but with the Reviews.* columns as NULL).
> >
> > > When I remove the final "ReviewerID = 2" restriction, all of the
right
> applicants are in the dataset--but with a lot of extra rows due to
reviews
> by other reviewers. How do I get rid of Reviewers {1, 3...n}, without
> losing all the applicants who've never met Reviewer #2?
> >
> > If "C.Reviewer.ID" is a typo for "Reviews.ReviewerID", the solution is
> > simple:
> >
> > SELECT Applicants.AppID, Applicants.Name, Applicants.Email,
> > Reviews.Quant, Reviews.Qual
> > FROM ApplicantStatus
> > INNER JOIN Applicants ON Applicants.AppID = ApplicantStatus.AppID
> > LEFT JOIN Reviews ON Reviews.AppID = Applicants.AppID
> > AND C.Reviewer.ID = 2
> > WHERE ApplicantStatus.Active = 1
> > AND ApplicantStatus.SCode = '####';
> >
> >
> > --
> > MySQL General Mailing List
> > For list archives: http://lists.mysql.com/mysql
> > To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
> >
> >
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
>