2016-11-17 87 views
3

我試圖瞭解MySql 5.7如何工作。在查詢波紋管SQLSTATE [42000]:語法錯誤或訪問衝突:1055表達式#2

 SELECT 
     r.*, 
     CONCAT(u.fname, ' ', u.lname) AS name 
     FROM 
     `events` AS r 
     LEFT JOIN `users` AS u 
      ON r.user_id = u.id 
     WHERE r.event_id = 1 
     GROUP BY r.user_id 
     ORDER BY r.date ; 

我得到一個錯誤「SELECT列表是不是在GROUP BY子句中包含非聚合列‘r.id’,這並不功能依賴於BY子句中的列組,這是不兼容的sql_mode = only_full_group_by [代碼:42000] 「

但是這樣的查詢工作正常:

SELECT 
     r.id, 
     r.event_id, 
     r.user_id, 
     r.date 
     CONCAT(u.fname, ' ', u.lname) AS name 
     FROM 
     `events` AS r 
     LEFT JOIN `users` AS u 
      ON r.user_id = u.id 
     WHERE r.event_id = 1 
     GROUP BY r.user_id, r.event_id, r.id, r.date 
     ORDER BY r.date ; 

由於我工作在本地主機上,我可以更改my.ini文件和設置的sql_mode爲」 STRICT_ALL_TABLES ,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER「

但是當上線時這將會成爲一個問題,因爲不會有很多人能夠訪問my.ini文件,尤其是共享主機。

在我看來,位無效宣佈每個字段和相應的聚合。

由於我在MySql中的知識只是初學者,有沒有更好的方法來編寫上述查詢。在我需要從單個表中抽取10或20個字段的情況下,將所有這些字段合併在一起看起來有點愚蠢。

回答

1

的概念很簡單,你必須在組未參與聚合功能的所有列聲明

SELECT 
    r.id, 
    r.event_id, 
    r.user_id, 
    r.date 
    CONCAT(u.fname, ' ', u.lname) AS name 
    FROM 
    `events` AS r 
    LEFT JOIN `users` AS u 
     ON r.user_id = u.id 
    WHERE r.event_id = 1 
    GROUP BY r.user_id, r.event_id, r.id, r.date 
    ORDER BY r.date ; 

相當於

SELECT DISTINCT 
    r.id, 
    r.event_id, 
    r.user_id, 
    r.date 
    CONCAT(u.fname, ' ', u.lname) AS name 
    FROM 
    `events` AS r 
    LEFT JOIN `users` AS u 
     ON r.user_id = u.id 
    WHERE r.event_id = 1 
    ORDER BY r.date ; 

在第一你有r。*但這不在組中

+0

對OP的注意:select語句中的聚合函數就像'count()','sum()'等等......你正在評估分組的所有值。 – Ray

+0

正確concat不是聚合函數是線性的.. group_concat是一個聚合函數 – scaisEdge

+0

DuH !!好,趕上,編輯我的評論 – Ray

相關問題