2017-03-16 64 views
-1

由於JSON支持,我剛將MySQL升級到5.7.17。項目中的一些更改需要此升級。只有一個SQL查詢不能按預期工作。我得到一個錯誤: ER_WRONG_FIELD_WITH_GROUPMySQL 5.7.17中的SQL查詢

我使用了它,並且大多數答案是:在sql模式下禁用ONLY_FULL_GROUP_BY。但這只是解決問題而不是解決問題。如我錯了請糾正我。

我的SQL是給問題:

SELECT users.*, 
     GROUP_CONCAT(d_user_link.public_key ORDER BY d_user_link.id) AS linked_devices, 
     permission_users.group_id, 
     permission_users.custom_permissions, 
     permission_groups.group_name, 
     permission_groups.group_permissions 
FROM users 
INNER JOIN permission_users 
    ON permission_users.user_id = users.id 
INNER JOIN permission_groups 
    ON permission_groups.id = permission_users.group_id 
LEFT JOIN d_user_link 
    ON d_user_link.user_id = users.id 
    AND d_user_link.disabled = 0 
WHERE users.id = ? 
GROUP BY users.id 

d_user_link不必爲每個用戶的結果,因爲有些用戶可以看到每一個設備(d_user_link是設備用戶鏈接),或不有任何鏈接的設備。

我希望你能幫助我解決這個問題。我無法通過使用其他搜索功能來獲得答案,即禁用ONLY_FULL_GROUP_BY

謝謝!

+3

的可能的複製[MySQL的:不是GROUP BY](http://stackoverflow.com/questions/25800411/mysql-isnt-in-group-by) – Shadow

+0

'users.id'在你的選擇中出現兩次,一次出現在'users。*'中,另一次出現爲'user_group_id'。這不是唯一的問題,btw – JohnHC

+0

啊,這是出於測試目的。它不在查詢中@JohnHC。謝謝!你看到了哪些問題? –

回答

0

此查詢的根本問題是權限。在較早版本的MySQL中,您的查詢將爲每個用戶返回一行,並對其擁有任意權限。也就是說,它會隨意丟棄用戶的權限。我會考慮這個錯誤。

這使得很難升級查詢。

當您將權限添加到group by時,您將獲得每個用戶多行。這可能不是這個意圖。一種選擇是從查詢中完全刪除權限。另一種方法是將它們組合在一起:

SELECT u.*, 
     GROUP_CONCAT(ul.public_key ORDER BY ul.id) AS linked_devices, 
     GROUP_CONCAT(pu.group_id ORDER BY pu.group_id) as group_ids, 
     GROUP_CONCAT(pu.custom_permissions ORDER BY pu.group_id) as custom_permissions, 
     GROUP_CONCAT(pg.group_name ORDER BY pu.group_id) as group_name, 
     GROUP_CONCAT(pg.group_permissions ORDER BY pu.group_id) as group_permissions 
FROM users u INNER JOIN 
    permission_users pu 
    ON pu.user_id = u.id INNER JOIN 
    permission_groups pg 
    ON pg.id = pu.group_id LEFT JOIN 
    d_user_link ul 
    ON ul.user_id = u.id AND ul.disabled = 0 
WHERE u.id = ? ; 
+0

感謝您的SQL!它像預期的那樣工作。只有拼寫錯誤是你在第一個group_concat中使用了'dl',但是稍後在sql中將其定義爲'ul'。由於最少6個字符,無法進行編輯。 permission_groups對每個用戶只有1行,所以這對我來說不是問題。我將從現在開始使用這個SQL。 –