[SQL] Group by alle kolommen selecteren
Beide queries doen het overigens prima in MySQL5 in ANSI mode.
Dit is mijn "foute" query:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$sQry = 'SELECT *,COUNT(hash) as merged,SUM(quantity) as amount' .
' FROM ' . SHOP_TO_PRODUCTS .
' WHERE suplier_id=' . (int)$_iIdentifier .
' AND is_listed=0' .
' GROUP BY hash';
?>
$sQry = 'SELECT *,COUNT(hash) as merged,SUM(quantity) as amount' .
' FROM ' . SHOP_TO_PRODUCTS .
' WHERE suplier_id=' . (int)$_iIdentifier .
' AND is_listed=0' .
' GROUP BY hash';
?>
Dit is mijn "verbeterde" query:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$sQry = 'SELECT op.*,COUNT(op2.hash) AS merged,SUM(op2.quantity) AS amount' .
' FROM ' . SHOP_TO_PRODUCTS . ' op' .
' INNER JOIN ' . SHOP_TO_PRODUCTS . ' op2' .
' ON (op2.suplier_id=' . (int)$_iIdentifier . ' AND op2.is_listed=0)' .
' WHERE op.o_product_id=op2.o_product_id' .
' GROUP BY op2.hash';
?>
$sQry = 'SELECT op.*,COUNT(op2.hash) AS merged,SUM(op2.quantity) AS amount' .
' FROM ' . SHOP_TO_PRODUCTS . ' op' .
' INNER JOIN ' . SHOP_TO_PRODUCTS . ' op2' .
' ON (op2.suplier_id=' . (int)$_iIdentifier . ' AND op2.is_listed=0)' .
' WHERE op.o_product_id=op2.o_product_id' .
' GROUP BY op2.hash';
?>
Nu denk ik dat MySQL de waarde van de kolom "op2.o_product_id" nog steeds uit zijn duim aan het zuigen is.
Is deze query goed?
Zo niet, hoe kan ik het verbeteren.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Bij gebruik van een GROUP BY moet elke kolom die in de SELECT voorkomt en geen onderdeel is van een aggregate functie (zoals COUNT() of SUM()) opgenomen worden in de GROUP BY.
Het gebruik van een * in combinatie met een GROUP BY is dus nooit echt handig, aangezien je dan uit je hoofd moet weten welke kolommen een bepaalde tabel bevat. Schrijf de kolomnamen liever uit...
ps. Om te zorgen dat MySQL een foutmelding geeft, zul je de sql_mode op ONLY_FULL_GROUP_BY moeten zetten. Helaas zit deze vanaf v4.1.11 niet meer in ANSI:
MySQL handleiding:
Before MySQL 4.1.11, ANSI also includes ONLY_FULL_GROUP_BY.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Ik denk dat ik er dan maar twee queries van maak.