I'm having a problem with Distrib 3.23.42 with the following query:

select x1.*,x2.* from x1 left join x2 on x1.d1=x2.d2 where x2.d2 is null;

I'm finding that a left join on datetime fields that do not allow nulls is not
working when I'm trying to emulate a subselect to find non-matching values
(taken right out of the "Solutions Miscellany" section of the Paul DuBois MySQL
book -- in my example below, I'm paralleling the example given in the book).

Bizarrely, if I negate the x2.d2 column in the where clause then the query works
(see in my example below). Also, if I alter the two tables to redefine the
datetime fields to allow nulls then the query works (also see in my example
below).

mysql> desc x1;
+-------+----------+------+-----+---------------------+-------+
| Field | Type     | Null | Key | Default             | Extra |
+-------+----------+------+-----+---------------------+-------+
| d1    | datetime |      |     | 0000-00-00 00:00:00 |       |
| c1    | char(1)  | YES  |     | NULL                |       |
+-------+----------+------+-----+---------------------+-------+
2 rows in set (0.00 sec)

mysql> select * from x1;
+---------------------+------+
| d1                  | c1   |
+---------------------+------+
| 2001-11-15 00:01:00 | a    |
| 2001-11-15 00:02:00 | b    |
| 2001-11-15 00:03:00 | c    |
+---------------------+------+
3 rows in set (0.00 sec)

mysql> desc x2;
+-------+----------+------+-----+---------------------+-------+
| Field | Type     | Null | Key | Default             | Extra |
+-------+----------+------+-----+---------------------+-------+
| d2    | datetime |      |     | 0000-00-00 00:00:00 |       |
| c2    | char(1)  | YES  |     | NULL                |       |
+-------+----------+------+-----+---------------------+-------+
2 rows in set (0.00 sec)

mysql> select * from x2;
+---------------------+------+
| d2                  | c2   |
+---------------------+------+
| 2001-11-15 00:02:00 | c    |
| 2001-11-15 00:03:00 | b    |
| 2001-11-15 00:04:00 | a    |
+---------------------+------+
3 rows in set (0.00 sec)

mysql> select x1.*,x2.* from x1 left join x2 on x1.d1=x2.d2;
+---------------------+------+---------------------+------+
| d1                  | c1   | d2                  | c2   |
+---------------------+------+---------------------+------+
| 2001-11-15 00:01:00 | a    | NULL                | NULL |
| 2001-11-15 00:02:00 | b    | 2001-11-15 00:02:00 | c    |
| 2001-11-15 00:03:00 | c    | 2001-11-15 00:03:00 | b    |
+---------------------+------+---------------------+------+
3 rows in set (0.00 sec)

mysql> select x1.*,x2.* from x1 left join x2 on x1.d1=x2.d2 where x2.d2 is null;
Empty set (0.00 sec)

mysql> select x1.*,x2.* from x1 left join x2 on x1.d1=x2.d2 where !x2.d2 is null;
+---------------------+------+------+------+
| d1                  | c1   | d2   | c2   |
+---------------------+------+------+------+
| 2001-11-15 00:01:00 | a    | NULL | NULL |
+---------------------+------+------+------+
1 row in set (0.00 sec)

mysql> alter table x1 modify d1 datetime null;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> alter table x2 modify d2 datetime null;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select x1.*,x2.* from x1 left join x2 on x1.d1=x2.d2 where x2.d2 is null;
+---------------------+------+------+------+
| d1                  | c1   | d2   | c2   |
+---------------------+------+------+------+
| 2001-11-15 00:01:00 | a    | NULL | NULL |
+---------------------+------+------+------+
1 row in set (0.00 sec)

If anyone can explain this I'd be grateful.

Kind regards,

Mark Ohrenschall


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