2010-05-01 18 views
0

我希望寫這些SQL查詢:可以在MySQL Group BY中使用多於1列?

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

但MySQL查詢瀏覽器給這個錯誤:

Operand Should Contain 1 column(s) 

我讀的地方可以在1個多列使用group by! 我該如何解決這個錯誤?或者我如何更改查詢以獲得相同的結果?

+0

你確定錯誤是指'GROUP BY'子句嗎?你給的語法是合適的,IWFM。 – outis 2010-05-01 15:44:17

+0

我99%肯定,因爲我的查詢中沒有operan,除了group之外,有2個參數 – Am1rr3zA 2010-05-01 19:17:41

+1

,不管你信不信,這還不夠,部分原因是還有其他操作數(例如AVG)。無論您發佈的查詢與您運行的查詢之間存在多麼微不足道的差異,是否存在差異?你使用的是什麼版本的MySQL?平均格柵的類型是什麼?實際上,表平均等級的定義是什麼(使用'SHOW CREATE TABLE averagegrade'?'SELECT'語句中的EXPLAIN'的結果是什麼(刪除'CREATE VIEW'子句)?嘗試從命令運行查詢看看它是否告訴你在聲明中問題所在的位置 – outis 2010-05-01 22:16:50

回答

6

你可以這樣做:

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

希望這有助於..

+0

否!OP的原始GROUP BY子句是正確的。支持GROUP BY中的多個以逗號分隔的列,屬於ANSI SQL標準的一部分,並且在我可以輕鬆檢查的時候已被MySQL支持([5.0](https://dev.mysql.com/ doc/refman/5.0/en/group-by-handling.html),在2005年發佈)而不是'CONCAT'不僅不必要而且效率低下,而且不正確*;這意味着'('foo','bar ','baz')'和'('fo','obarb','az')'將錯誤地分組在一起。 – 2016-01-31 21:08:00

3

是的,你可以在GROUP逗號分隔的多個列或表達式BY子句酷似OP一樣。舉一個例子,從the MySQL docs

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

不要使用CONCAT()不是作爲the accepted answer suggests;它會給你不正確的結果,因爲CONCAT('foo', 'bar', 'baz')CONCAT('fo', 'obarb', 'az')是相同的。

由OP公佈的SQL很好,因爲它是。他收到的錯誤消息一定是由他在發帖之前刪除的其他內容引起的;他發佈的代碼不會產生他說的錯誤。這裏是證明:

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我的問題是5幾年前,我不記得實際問題是什麼,但@伊恩的答案解決了我的問題,但你的解決方案似乎也是合法的 – Am1rr3zA 2016-02-01 20:22:08