I've found yet another oddity with this situation. If I leave the date test
off of both JOINs they give the same number of rows, but they give me the
wrong number! Neither one of them gives me 860 rows returned. I must not
understand how a LEFT JOIN works.
By the way, the EXPLAIN for both of my original queries is the same:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: eo_name_table
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 860
Extra: Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: prod
type: ref
possible_keys: prod_title,prod_title_fulltext
key: prod_title
key_len: 766
ref: giiexpr_db.eo_name_table.eo_name
rows: 1
Extra: Using where
2 rows in set (0.05 sec)
>I have a table, eo_name_table, that has exactly 860 unique titles in it.
>Each record also has a date field, eo_pub_date:
>
>+-------------+--------------+------+-----+---------+-------+
>| Field | Type | Null | Key | Default | Extra |
>+-------------+--------------+------+-----+---------+-------+
>| eo_name | varchar(255) | | PRI | | |
>| eo_pub_date | date | YES | | NULL | |
>+-------------+--------------+------+-----+---------+-------+
>
>I have another table, prod, that has many fields in it but the fields of
>interest are prod_num, prod_title, prod_discont, and prod_published. The
>other fields are irrelevant Here is the structure of the prod table:
>
>+---------------------+-----------------------+------+-----+---------+--
>----
>-+
>| Field | Type | Null | Key | Default |
>Extra
>|
>+---------------------+-----------------------+------+-----+---------+--
>----
>-+
>| prod_id | varchar(15) | | PRI | |
>|
>| prod_num | mediumint(6) unsigned | YES | MUL | NULL |
>|
>| prod_title | varchar(255) | YES | MUL | NULL |
>|
>| prod_type | varchar(2) | YES | | NULL |
>|
>| prod_vat_pct | decimal(5,2) | YES | | NULL |
>|
>| prod_discont | tinyint(1) | YES | | NULL |
>|
>| prod_ready | tinyint(1) | YES | | NULL |
>|
>| pub_id | varchar(15) | YES | MUL | NULL |
>|
>| prod_published | date | YES | | NULL |
>|
>| prod_pub_prod_id | varchar(255) | YES | MUL | NULL |
>|
>| prod_pub_acct_id | varchar(2) | YES | | NULL |
>|
>| prod_pub_doi | date | YES | | NULL |
>|
>| prod_pub_resp | date | YES | | NULL |
>|
>| prod_pub_prod_url | varchar(255) | YES | | NULL |
>|
>| prod_rel_freq | smallint(3) | YES | | NULL |
>|
>| prod_content_info | varchar(255) | YES | | NULL |
>|
>| prod_info_type | varchar(5) | YES | | NULL |
>|
>| prod_language | varchar(50) | YES | | NULL |
>|
>| prod_broch_doc | varchar(255) | YES | | NULL |
>|
>| prod_samp_doc | varchar(255) | YES | | NULL |
>|
>| prod_samp_pgs | varchar(255) | YES | | NULL |
>|
>| prod_exec_summ | varchar(255) | YES | | NULL |
>|
>| prod_toc_doc | varchar(255) | YES | | NULL |
>|
>| prod_e_title_tag | varchar(255) | YES | | NULL |
>|
>| prod_meta_tags | varchar(255) | YES | | NULL |
>|
>| prod_keywords | varchar(255) | YES | | NULL |
>|
>| prod_comments | text | YES | | NULL |
>|
>| prod_if_sample_pdf | varchar(255) | YES | | NULL |
>|
>| prod_stop_date | date | YES | | NULL |
>|
>| prod_hide_web | tinyint(1) | YES | | NULL |
>|
>| prod_changed | tinyint(1) | YES | | NULL |
>|
>| prod_export | tinyint(1) | YES | | NULL |
>|
>| prod_export_pending | tinyint(1) | YES | | NULL |
>|
>| prod_scoop_changed | tinyint(1) | YES | | NULL |
>|
>| prod_on_scoop | tinyint(1) | YES | | NULL |
>|
>| prod_added | datetime | YES | | NULL |
>|
>| prod_updated | datetime | YES | | NULL |
>|
>+---------------------+-----------------------+------+-----+---------+--
>----
>-+
>
>I am trying to break eo_name_table into two sets, based upon matching
>eo_name_table.eo_pub_date against prod.prod_published. The first query
>is
>
>SELECT IF(prod.prod_published IS NOT NULL, prod.prod_published, "") AS
>pub_date,
> IF(prod.prod_num IS NOT NULL, prod.prod_num, "") AS prod_num,
> IF(prod.prod_discont = 0 OR prod.prod_discont IS NULL, "",
>"Discontinued") AS discont,
> IF(prod.prod_title IS NOT NULL, prod.prod_title, "") AS
>match_title
>FROM eo_name_table LEFT JOIN prod ON eo_name_table.eo_name =
>prod.prod_title
>
> AND eo_name_table.eo_pub_date <= prod.prod_published
>WHERE (prod.prod_discont = 0 OR prod.prod_discont IS NULL)
>ORDER BY eo_name_table.eo_name;
>
>As expected, this gives me exactly 860 rows in the result because the
>left
>join should give me (at least) one result row for each row in
>eo_name_table.
>Some of these rows, of course, have "" values for every field.
>
>Now I want to find the inverse set:
>
>SELECT IF(prod.prod_published IS NOT NULL, prod.prod_published, "") AS
>pub_date,
> IF(prod.prod_num IS NOT NULL, prod.prod_num, "") AS prod_num,
> IF(prod.prod_discont = 0 OR prod.prod_discont IS NULL, "",
>"Discontinued") AS discont,
> IF(prod.prod_title IS NOT NULL, prod.prod_title, "") AS
>match_title
>FROM eo_name_table LEFT JOIN prod ON eo_name_table.eo_name =
>prod.prod_title
>
> AND eo_name_table.eo_pub_date > prod.prod_published
>WHERE (prod.prod_discont = 0 OR prod.prod_discont IS NULL)
>ORDER BY eo_name_table.eo_name;
>
>Instead of getting 860 rows in the result, I get 804 rows.
>
>I've been wrestling with this for days. What am I missing?
>
>
>Regards,
>
>Jerry Schwartz
>The Infoshop by Global Information Incorporated
>195 Farmington Ave.
>Farmington, CT 06032
>
>860.674.8796 / FAX: 860.674.8341
>
>www.the-infoshop.com
>www.giiexpress.com
>www.etudes-marche.com
>
>
>
>
>
>--
>MySQL General Mailing List
>For list archives: http://lists.mysql.com/mysql
>To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
>infoshop.com
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]