On Mon, 20 Sep 2004 10:25:16 -0400 [EMAIL PROTECTED] wrote: > I think you missed my point. I think the 5.0.1 behavior was correct > and the others are wrong. There is a known bug (or two) about mixing > outer joins and inner joins and it looks like it may be fixed. IF > you want to see all of the students THAT TABLE (students) needs to > be on the LEFT side of a LEFT JOIN or the RIGHT side of a RIGHT > JOIN. That's what the directions mean....
Interesting - do you have a link to more information on this bug? > SELECT s.tech_id, s.full_name, sa.points_awarded, sa.date_submitted > FROM student s > INNER JOIN enrollment e > ON e.tech_id = s.tech_id > AND e.term_id = '3' > LEFT JOIN submitted_assignment sa > ON sa.tech_id = s.tech_id > LEFT JOIN assignment a > ON a.a_id = sa.a_id > AND a.a_id = '100' > ORDER BY s.full_name; > > I also moved the clause "AND a.a_id = '100'" into the ON portion of > the LEFT JOIN. That way you can see who did and didn't get that > assignment. > > If you describe what you WANT to see, I can help you write the query > to get it. What I think I wrote for you will be "all students where > term_ID=3 and what grades they got on assignment 100." But i think > you may get some duplicate rows of blank scores. Does "assignment" > relate to "student", perhaps with a tech_id or student_id field? > That fixes one dilemma by setting up the following query > > SELECT s.tech_id, s.full_name, if(isnull(a.a_ID),'no','yes') as > assigned_100, sa.points_awarded, sa.date_submitted > FROM student s > INNER JOIN enrollment e > ON e.tech_id = s.tech_id > AND e.term_id = '3' > LEFT JOIN assignment a > ON a.student_ID = s.student_ID > AND a.a_id = '100' > LEFT JOIN submitted_assignment sa > ON sa.tech_id = s.tech_id > AND a.a_id = sa.a_id > ORDER BY s.full_name; This is what I eventually used: SELECT s.tech_id, s.full_name, sa.points_awarded, sa.date_submitted FROM student s INNER JOIN enrollment e ON e.tech_id = s.tech_id LEFT JOIN submitted_assignment sa ON sa.tech_id = s.tech_id AND sa.a_id = '$a_id' LEFT JOIN assignment a ON a.a_id = sa.a_id WHERE e.term_id = '3' ORDER BY s.full_name; It didn't seem to work with the "AND sa.a_id = '$a_id'" in the assignment join condition - but this works. I don't understand why that doesn't filter the right rows if it's in the WHERE clause, I usually define my JOIN condition solely on the column(s) being joined together and any additional filtering gets done in the WHERE clause. Man, I thought I had a good handle on OUTER JOINs. Erg. Josh -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]