par
Ripat » 06 oct. 2005, 09:18
Intéressant.
En théorie, les champs qui apparaissent dans la clause HAVING doivent provenir du SELECT.
Oui et non. Apparemment, tout dépend de la version.
Un peu de théorie donc (tirée de la
doc - en anglais car, une fois encore, la doc en français est curieusement muette sur le sujet):
- Avant 5.0.2 les colonnes du HAVING doivent faire référence aux colonnes définies dans un des groupes suivant:
- SELECT
- des fonctions de groupement (Aggregate Functions)
- subqueries
Code : Tout sélectionner
SELECT COUNT(*) FROM table GROUP BY col1 HAVING col1 = 2; # retourne une erreur
SELECT COUNT(*), col1 FROM table GROUP BY col1 HAVING col1 = 2; # correct
- Après 5.0.2 les colonnes du HAVING doivent faire référence aux colonnes définies dans un des groupes suivant:
- SELECT
- des fonctions de groupement (Aggregate Functions)
- subqueries
- GROUP BY
Code : Tout sélectionner
SELECT COUNT(*) FROM table GROUP BY col1 HAVING col1 = 2; # requête correcte
- Et, pour info, en SQL standard:
- des fonctions de groupement (Aggregate Functions)
- GROUP BY
Ca, c'est la théorie. En pratique, d'après ce qui précède, dans MySQL 4.1 une requête comme :
devrait marcher puisque référence est faite à la fonction de groupement COUNT(). Et bien, non, ça ne marche pas. Donc il y aurait peut-être bien un bug ou, à tout le moins, une imprécision dans la doc. Je poste ceci sur le forum de MySQL AB et je posterai ici la réponse.
Intéressant.
[quote="Hash Air"]En théorie, les champs qui apparaissent dans la clause HAVING doivent provenir du SELECT.[/quote]
Oui et non. Apparemment, tout dépend de la version.
Un peu de théorie donc (tirée de la [url=http://dev.mysql.com/doc/mysql/en/select.html]doc[/url] - en anglais car, une fois encore, la doc en français est curieusement muette sur le sujet):
[list=1]
[*]Avant 5.0.2 les colonnes du HAVING doivent faire référence aux colonnes définies dans un des groupes suivant:
[list]
[*]SELECT
[*]des fonctions de groupement (Aggregate Functions)
[*]subqueries[/list]
[code]SELECT COUNT(*) FROM table GROUP BY col1 HAVING col1 = 2; # retourne une erreur
SELECT COUNT(*), col1 FROM table GROUP BY col1 HAVING col1 = 2; # correct[/code]
[*]Après 5.0.2 les colonnes du HAVING doivent faire référence aux colonnes définies dans un des groupes suivant:
[list]
[*]SELECT
[*]des fonctions de groupement (Aggregate Functions)
[*]subqueries
[*]GROUP BY[/list]
[code]SELECT COUNT(*) FROM table GROUP BY col1 HAVING col1 = 2; # requête correcte[/code]
[*]Et, pour info, en SQL standard:
[list]
[*]des fonctions de groupement (Aggregate Functions)
[*]GROUP BY[/list][/list]
Ca, c'est la théorie. En pratique, d'après ce qui précède, dans MySQL 4.1 une requête comme :
[code]SELECT COUNT(col1) FROM table GROUP BY col1 HAVING col1 = 2;[/code]
devrait marcher puisque référence est faite à la fonction de groupement COUNT(). Et bien, non, ça ne marche pas. Donc il y aurait peut-être bien un bug ou, à tout le moins, une imprécision dans la doc. Je poste ceci sur le forum de MySQL AB et je posterai ici la réponse.