2017-03-16 28 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。 –