I never thought of putting an additional condition on the LEFT JOIN. That
seems to do the trick.

My original query, with the sub-SELECT, does work. Both your technique and
mine generate identical results.

I did an EXPLAIN on each technique, but I don't know enough to interpret it.

Since the "rows" is identical except for the last bit, where mine is 4 and
yours is 2, does that mean yours is roughly more efficient by a 2:1 ratio?

My real query is rather more complicated that the one we originally
discussed, but I don't think that affects the comparison. You'll notice that
I changed one of your ON clauses to a WHERE clause, and that did not change
the EXPLAIN output one iota.

Here are the results of the EXPLAINs:

mysql> explain
    -> SELECT prod.prod_num,
    ->   prod_price.prod_price_del_format,
    ->   "USD",
    ->   prod_price.prod_price_disp_price,
    ->   "YEN",
    ->   prod_price.prod_price_end_price * @exchange AS yen_end_price
    ->
    -> FROM
    ->   pub JOIN
    ->   prod JOIN
    ->   prod_price LEFT JOIN
    ->   prod_price AS pp ON (prod.prod_id = pp.prod_id AND
pp.prod_price_end_cu
rr = 'YEN')
    ->
    -> WHERE
    ->       pub.pub_code IN ('ENER', 'FIT', 'GOVT', 'HEAL', 'ID', 'LIFE',
'MANU
')
    ->   AND pub.pub_id = prod.pub_id
    ->   AND prod.prod_id = prod_price.prod_id
    ->   AND prod.prod_discont = 0
    ->   AND prod_price.prod_price_end_curr = 'USD'
    ->   AND pp.prod_id IS NULL\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: prod_price
         type: ALL
possible_keys: prod_id
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 75230
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: prod
         type: eq_ref
possible_keys: PRIMARY,pub_id
          key: PRIMARY
      key_len: 45
          ref: giiexpr_db.prod_price.prod_id
         rows: 1
        Extra: Using where
*************************** 3. row ***************************
           id: 1
  select_type: SIMPLE
        table: pub
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 45
          ref: giiexpr_db.prod.pub_id
         rows: 1
        Extra: Using where
*************************** 4. row ***************************
           id: 1
  select_type: SIMPLE
        table: pp
         type: ref
possible_keys: prod_id
          key: prod_id
      key_len: 46
          ref: giiexpr_db.prod.prod_id
         rows: 2
        Extra: Using where

==============================================================

mysql> explain
    -> SELECT prod.prod_num,
    ->   prod_price.prod_price_del_format,
    ->   "USD",
    ->   prod_price.prod_price_disp_price,
    ->   "YEN",
    ->   prod_price.prod_price_end_price * @exchange AS yen_end_price
    ->
    ->
    -> FROM
    ->   pub JOIN
    ->   prod JOIN
    ->   prod_price
    ->
    -> WHERE
    ->       pub.pub_code IN ('ENER', 'FIT', 'GOVT', 'HEAL', 'ID', 'LIFE',
'MANU
')
    ->   AND pub.pub_id = prod.pub_id
    ->   AND prod.prod_id = prod_price.prod_id
    ->   AND prod.prod_discont = 0
    ->   AND prod_price.prod_id NOT IN
    ->    (SELECT prod_price.prod_id
    ->     FROM prod_price
    ->     WHERE prod_price.prod_price_end_curr = 'YEN')\G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: prod_price
         type: ALL
possible_keys: prod_id
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 75230
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: PRIMARY
        table: prod
         type: eq_ref
possible_keys: PRIMARY,pub_id
          key: PRIMARY
      key_len: 45
          ref: giiexpr_db.prod_price.prod_id
         rows: 1
        Extra: Using where
*************************** 3. row ***************************
           id: 1
  select_type: PRIMARY
        table: pub
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 45
          ref: giiexpr_db.prod.pub_id
         rows: 1
        Extra: Using where
*************************** 4. row ***************************
           id: 2
  select_type: DEPENDENT SUBQUERY
        table: prod_price
         type: index_subquery
possible_keys: prod_id
          key: prod_id
      key_len: 46
          ref: func
         rows: 4
        Extra: Using index; Using where

Thoughts? Explanations?

Thanks.

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]

Reply via email to