> hist.id will never be NULL and 5 at the same time.  Your clauses conflict
> with each other.
> You need to re-write your query.

This is ture, except the query suceeds if there is records in 'hist'
Even if it is not a bug it is at least inconsistent behaviour of MySQL



>
> "Michael Griffith" <[EMAIL PROTECTED]> wrote:
>
> EXPLAIN LEFT JOIN fails when joining on an empty table with constant in
> WHERE clause
>
> CREATE TABLE idx (
>   id mediumint,
>   KEY id (id),
> ) TYPE=MyISAM
>
> CREATE TABLE hist (
>   id mediumint,
>   link mediumint,
>   KEY id (id,link)
> ) TYPE=MyISAM
>
> Table idx is populated with thousands or records. Consider the following
> query:
>
> 1.   SELECT idx.id FROM idx
> 2.   LEFT JOIN hist ON hist.link=idx.id AND hist.id=5
> 3.   WHERE
> 4.   hist.id=5 AND
> 5.   hist.id IS NULL AND
> 6.   idx.id=2
>
> The query works perfectly, buy ONLY if table 'hist' is populated. If table
> 'hist' is empty then the query returns no results. This is easy to fix by
> commenting out line #4. However by commenting out line 4 the optimizer
> decides to use a temporary table which would slow it down.
>
> Here is the EXPLAIN output as shown above with empty 'hist' table:
> "Impossible WHERE noticed after reading const tables"
>
> Here is the EXPLAIN output from above query when 'hist' has 1 record:
>
> | table | type | possible_keys | key  | key_len   | ref        | rows |
> Extra
>
+-------+------+---------------+------+---------+------------+------+-------
>
> ------------------------------+
> | idx   | ref  | id            | id   |       3 | const        |    3 |
> where used ; Using index  (using temp without ln #4)
> | hist  | ref  | id            | id   |       6 | const,idx.id |    2 |
> where used; Using index; Not exists
>
+-------+------+---------------+------+---------+------------+------+-------
>
> ------------------------------+
>
> It seems the optimizer is checking the constant in hist before it even
> considers this is a LEFT JOIN. This is a problem on my Windows MySQL
> 3.23.33. Based on the EXPLAIN output of a simpler query I do not believe
> 3.22 does the same thing.
>
>
>
>
>
>
>


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