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