>From: Bill Newton [mailto:[EMAIL PROTECTED] >Sent: Monday, April 14, 2008 2:09 PM >To: Jerry Schwartz >Cc: 'Mysql' >Subject: Re: LEFT JOIN problem > >Hi Jerry, > >I think the problem is that NULL is not less than or greater than your >prod_published date. So you probably have eo_pub_date set to NULL in 56 >of your rows. [JS] I wish it were that simple. There are no rows in eo_name_table where eo_pub_date is NULL.
> >so for > > eo_name_table.eo_pub_date > prod.prod_published > >or > >eo_name_table.eo_pub_date <= prod.prod_published > >mysql will rerturn false if eo_name_table.eo_pub_date is NULL for >either test. [JS] But it evidently does not. The second one works perfectly, the one above does not. > > > > >Jerry Schwartz wrote: >> 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]