2010-05-01 5 views
0

Je veux écrire ces requêtes SQL:pouvez utiliser plus de 1 colonne dans MySQL Group BY?

CREATE VIEW `uniaverage` AS 
    SELECT `averagegrade`.`mjr`,`averagegrade`.`lev`, 
    AVG(`averagegrade`.`average`) AS `uniAVG` 
    FROM `averagegrade` GROUP BY `averagegrade`.`lev`, `averagegrade`.`mjr`; 

Mais MySQL Query Browser donne cette erreur:

Operand Should Contain 1 column(s) 

Je lis quelque part peut utiliser par groupe sur plus de 1 colonne !!! Comment puis-je résoudre cette erreur? ou comment puis-je changer la requête pour obtenir le même résultat?

+0

Êtes-vous sûr que l'erreur fait référence à la clause 'GROUP BY'? La syntaxe que vous donnez est appropriée, et IWFM. – outis

+0

Je suis sûr à 99% parce que je n'ai pas d'operan dans mon groupe de requête sauf celui qui a 2 arguments – Am1rr3zA

+1

qui, croyez-le ou non, ne suffit pas, en partie parce qu'il y a d'autres opérandes (AVG par exemple). Y a-t-il des différences, aussi triviales que cela puisse paraître, entre la requête que vous avez publiée et ce que vous avez lancé? Quelle version de MySQL utilisez-vous? Quel est le type de moyenne de table? En fait, quelle est la définition de la note moyenne de la table (utilisez 'SHOW CREATE TABLE averagegrade'? Quel est le résultat de' EXPLAIN' sur l'instruction 'SELECT' (supprimez la clause' CREATE VIEW')? Essayez d'exécuter la requête depuis la commande ligne client pour voir si elle vous dit où se trouve le problème dans l'énoncé – outis

Répondre

6

Vous pouvez le faire:

GROUP BY CONCAT(field1, field2, field3, etc) 

Hope this helps ..

+0

Non! La clause GROUP BY originale de l'OP était correcte; plusieurs colonnes séparées par des virgules dans GROUP BY sont supportées, font partie du standard SQL ANSI et ont été supportées par MySQL aussi loin dans l'histoire que je peux facilement vérifier ([5.0] (https://dev.mysql.com/ doc/refman/5.0/fr/group-by-handling.html), publié en 2005). Faire 'CONCAT' à la place est non seulement inutile et inefficace, mais * incorrect *, cela signifie que' ('foo', 'bar ',' baz ') 'et' (' fo ',' obarb ',' az ') 'seront incorrectement regroupés –

3

Oui, vous pouvez avoir plusieurs colonnes ou expressions séparées par des virgules dans une clause GROUP BY exactement comme l'OP a fait. Pour prendre un exemple de the MySQL docs:

SELECT id, FLOOR(value/100) AS val 
FROM tbl_name 
GROUP BY id, val; 

Ne pas utiliserCONCAT() au lieu que the accepted answer suggests; il vous donnera des résultats incorrects, puisque CONCAT('foo', 'bar', 'baz') et CONCAT('fo', 'obarb', 'az') sont les mêmes.

Le code SQL affiché par l'OP est correct tel quel. Le message d'erreur qu'il recevait doit avoir été provoqué par quelque chose d'autre dans sa requête qu'il a supprimé avant de l'envoyer ici; son code posté ne génère pas l'erreur qu'il dit faire. Voici la preuve:

mysql> CREATE TABLE averagegrade (mjr int, lev int, average int); 
Query OK, 0 rows affected (0.12 sec) 

mysql> INSERT INTO averagegrade VALUES (5,6,7), (5,6,7), (100, 200, 300); 
Query OK, 3 rows affected (0.05 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

mysql> 
mysql> -- OP's SQL, copied verbatim: 
mysql> CREATE VIEW `uniaverage` AS 
    -> SELECT `averagegrade`.`mjr`,`averagegrade`.`lev`, 
    ->  AVG(`averagegrade`.`average`) AS `uniAVG` 
    -> FROM `averagegrade` GROUP BY `averagegrade`.`lev`, `averagegrade`.`mjr`; 
Query OK, 0 rows affected (0.03 sec) 

mysql> 
mysql> SELECT * FROM uniaverage; 
+------+------+----------+ 
| mjr | lev | uniAVG | 
+------+------+----------+ 
| 5 | 6 | 7.0000 | 
| 100 | 200 | 300.0000 | 
+------+------+----------+ 
2 rows in set (0.00 sec) 
+0

TBH ma question était pour 5 il y a des années et je ne me souviens pas quel était le problème réel, mais la réponse de Ian a résolu mon problème encore votre solution semble légitime aussi – Am1rr3zA