Hi.

On Fri 2003-01-31 at 15:46:37 -0000, [EMAIL PROTECTED] wrote:
> Hi All,
> 
> Can anyone help me get this query working in MySQL, this was created using
> Access, but it doesn't port well for MySQL syntax:
> 
> SELECT basket.id,
> products.part_code,
> products.product_type,
> products.description,
> product_options_1.options,
> basket.price, basket.quantity,
> basket.price*basket.quantity AS total
> FROM (products LEFT JOIN product_options ON
> products.prod_id=product_options.prod_id)
> RIGHT JOIN (product_options AS product_options_1 RIGHT JOIN (basket_header
> INNER JOIN basket ON basket_header.basket_id=basket.basket_id) ON
> product_options_1.po_id=basket.op_id) ON products.prod_id=basket.prod_id
> GROUP BY basket.id, products.part_code, products.product_type,
> products.description, product_options_1.options, basket.price,
> basket.quantity, basket.price*basket.quantity, basket_header.basket_id,
> products.options
> HAVING (((basket_header.basket_id)=4));

Reformatting for readability that is:

SELECT   basket.id,
         products.part_code,
         products.product_type,
         products.description,
         product_options_1.options,
         basket.price,
         basket.quantity,
         basket.price*basket.quantity AS total
FROM     ( products
           LEFT JOIN product_options
           ON product_options.prod_id = products.prod_id )
         RIGHT JOIN
         ( product_options AS product_options_1
           RIGHT JOIN
           ( basket_header
             INNER JOIN basket
             ON basket.basket_id = basket_header.basket_id )
           ON product_options_1.po_id = basket.op_id )
         ON products.prod_id = basket.prod_id
GROUP BY basket.id, products.part_code, products.product_type,
         products.description, product_options_1.options,
         basket.price, basket.quantity, total,
         basket_header.basket_id, products.options
HAVING   basket_header.basket_id=4;


> Here is the error message MySQL reports:
> 
> ERROR 1064: You have an error in your SQL syntax near '(product_options AS
> product_options_1 RIGHT JOIN (basket_header INNER JOIN baske' at line 9
> 
> Seems MySQL doesn't like the RIGHT JOIN syntax. Any ideas to the correct
> syntax?

Oh, RIGHT JOINs are fine. What it doesn't like are the parenthesis, I
think. So simply reordering the joins (and by that replacing RIGHT
JOINs with LEFT JOINs were appropriate and vice versa) should do the
trick.

FROM     ( ( basket_header
             INNER JOIN basket
             ON basket.basket_id = basket_header.basket_id )
           LEFT JOIN product_options AS product_options_1
           ON product_options_1.po_id = basket.op_id )  
         LEFT JOIN
         ( products
           LEFT JOIN product_options
           ON product_options.prod_id = products.prod_id )
         ON products.prod_id = basket.prod_id

Now, a lot of the parenthesis are redundant.

Written this way, it becomes more obvious, that product_options (not
product_options_1) is neither referenced by a other table in an ON
clause nor used in the select part, so what is the reason to include
it to begin with? It's redundant.

Additionally, I don't see the reason for the HAVING clause. IMHO the
condition would be as good in the WHERE clause (where the optimizer
can make better use of it).

Aside from that, I prefer table aliases to get rid of the long names,
so the end result would look like

SELECT   basket.id,
         p.part_code, p.product_type, p.description,
         po1.options,
         b.price, b.quantity,
         b.price*b.quantity AS total
FROM     basket_header bh
         INNER JOIN basket b ON b.basket_id = bh.basket_id
         LEFT JOIN products p ON p.prod_id = b.prod_id
         LEFT JOIN product_options po1 ON po1.po_id = b.op_id
HAVING   bh.basket_id = 4;
GROUP BY b.id, p.part_code, p.product_type, p.description, po1.options,
         b.price, b.quantity, total, bh.basket_id, p.options

(I did not rename po1 to po in order to avoid confusion.)

HTH,

        Benjamin.

-- 
[EMAIL PROTECTED]

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