[SQL] Group by alle kolommen selecteren
Ik probeer een qeury te verbeteren, maar ik heb het idee dat mijn verbeterde versie nog steeds kolom waardes aan het gokken is.
Beide queries doen het overigens prima in MySQL5 in ANSI mode.
Dit is mijn "foute" query:
Dit is mijn "verbeterde" query:
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.
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
Nope, deze is inderdaad nog niet goed. Als regel voor GROUP BY kun je de volgende aanhouden:
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:
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:
Before MySQL 4.1.11, ANSI also includes ONLY_FULL_GROUP_BY.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit




