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]

Reply via email to