[SQL] Group by alle kolommen selecteren

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Martijn B

Martijn B

03/01/2008 10:18:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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';
?>


Dit is mijn "verbeterde" query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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';
?>


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

PHP hulp

26/04/2024 06:43:14
 
Joren de Wit

Joren de Wit

03/01/2008 12:53:00
Quote Anchor link
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:
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
 
Martijn B

Martijn B

03/01/2008 17:42:00
Quote Anchor link
Ok, dank je wel.

Ik denk dat ik er dan maar twee queries van maak.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.