From: Harald Kleiner <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Subject: unexpected results using LEFT JOIN with more than one join_condition

 >Description:

I use LEFT JOIN to join together two tables. And (for some 'complex' 
reason) I want to add additional conditions into the join_condition-part 
(and not in the WHERE part where it would belong to). But these additional 
conditions seem to be ignored just as if they weren't there. If I cut the 
'ON'-part and move conditions to the 'WHERE' all goes the way it should.

Changing the join method from LEFT JOIN to INNER JOIN does fix the problem 
- yes but alas I need a LEFT JOIN in this case.

The manual says
   "The ON conditional is any conditional of the form that may be used in a 
WHERE clause."
So it _should_ be allowed to do the things that I do...

Maybe this is all my fault - so please be patient. But in any case: Thank 
you very much for spending time with my problem!


 >How-To-Repeat:

I have constructed a simplified example that shows the unexpected behavior. 
A table called person is linked with room-table. Both have a date-typed 
field that holds deletion-date of the record. Now I want to get all persons 
with their room codes which are _not_ deleted
(i.e. deleted==0).

As you can see the first query uses LEFT JOIN ... ON ... and returns all 
four persons. (Joe gets returned even though he has a non-zero 
deletion-date -- that's what I don't understand)

And in the second query I just replaced the first 'AND' with a 'WHERE' and 
voila Joe falls out (because of his non-zero deletion-date) and Fred falls 
out because of his null room (room.deleted gets null I think) -- that's 
what I expected to get.



DROP DATABASE JOINTest;
CREATE DATABASE JOINTest;
USE JOINTest;

CREATE TABLE person (
   personID INT AUTO_INCREMENT NOT NULL,
   roomID INT,
   name VARCHAR(20),
   deleted DATE,
   PRIMARY KEY(personID)
);

CREATE TABLE room (
   roomID INT AUTO_INCREMENT NOT NULL,
   roomcode VARCHAR(20),
   deleted DATE,
   PRIMARY KEY(roomID)
);

INSERT INTO person VALUES(NULL, 0, 'Fred', 0);
INSERT INTO person VALUES(NULL, 1, 'Max', 0);
INSERT INTO person VALUES(NULL, 1, 'Joe', '2002-07-01');
INSERT INTO person VALUES(NULL, 1, 'Anne', 0);

INSERT INTO room VALUES(NULL, 'R001', 0);


SELECT DISTINCTROW person.name, person.deleted, room.roomcode
FROM person LEFT JOIN room ON person.roomID=room.roomID AND 
person.deleted=0 AND room.deleted=0;
+------+------------+----------+
| name | deleted    | roomcode |
+------+------------+----------+
| Fred | 0000-00-00 | NULL     |
| Max  | 0000-00-00 | R001     |
| Joe  | 2002-07-01 | NULL     |
| Anne | 0000-00-00 | R001     |
+------+------------+----------+
4 rows in set (0.00 sec)


SELECT DISTINCTROW person.name, person.deleted, room.roomcode
FROM person LEFT JOIN room ON person.roomID=room.roomID WHERE 
person.deleted=0 AND room.deleted=0;
+------+------------+----------+
| name | deleted    | roomcode |
+------+------------+----------+
| Max  | 0000-00-00 | R001     |
| Anne | 0000-00-00 | R001     |
+------+------------+----------+
2 rows in set (0.00 sec)



 >Fix:

Yes, I could move additional criteria into the WHERE but that would be not 
as beautiful and easy for me as putting it into the ON - part. And even in 
the manual (chapter 9.8.1, The Twin Project) such a join is used. So it 
_should_ work.


 >Submitter-Id:
 >Originator:    Harald Kleiner
 >Organization:

 >MySQL support: none
 >Synopsis:      unexpected LEFT JOIN behavior
 >Severity:      non-critical
 >Priority:      low
 >Category:      mysql
 >Class:         sw-bug | support
 >Release:       mysql-3.23.33 (Source distribution)
 >Server: /usr/bin/mysqladmin  Ver 8.15 Distrib 3.23.33, for suse-linux on i686
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Server version          3.23.33-log
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/lib/mysql/mysql.sock
Uptime:                 54 min 52 sec

Threads: 3  Questions: 618  Slow queries: 0  Opens: 56  Flush tables: 
1  Open tables: 50 Queries per second avg: 0.188
 >Environment:
         SuSE Linux 7.1 (but with some updates already) on an AMD Duron, 
256MB RAM
System: Linux haraldk 2.4.7-4GB #1 Thu Oct 25 19:17:11 GMT 2001 i686 unknown
Architecture: i686

Some paths:  /usr/bin/perl /usr/bin/make /usr/bin/gmake /usr/bin/gcc 
/usr/bin/cc
GCC: Reading specs from /usr/lib/gcc-lib/i486-suse-linux/2.95.2/specs
gcc version 2.95.2 19991024 (release)
Compilation info: CC='gcc'  CFLAGS='-O2 -m486'  CXX='c++'  CXXFLAGS='-O2 
-m486'  LDFLAGS=''
LIBC:
-rwxr-xr-x    1 root     root      1382179 Jan 19  2001 /lib/libc.so.6
-rw-r--r--    1 root     root      2585872 Jan 19  2001 /usr/lib/libc.a
-rw-r--r--    1 root     root          178 Jan 19  2001 /usr/lib/libc.so
-rw-r--r--    1 root     root       851660 Jan 19  2001 /usr/lib/libc-client.a
lrwxrwxrwx    1 root     root           19 Apr 24 23:52 
/usr/lib/libc-client.so -> libc-client.so.2000
-rwxr-xr-x    1 root     root       714876 Jan 19  2001 
/usr/lib/libc-client.so.2000
Configure command: ./configure  --enable-shared --enable-assembler 
--infodir=/usr/share/info --libdir=/usr/lib --libexecdir=/usr/sbin --local



---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to