MySQL 5.7.17中的SQL查询

时间:2017-03-16 09:23:08

标签: mysql sql mysql-5.7

由于JSON支持,我刚刚将MySQL升级到5.7.17。项目中的某些更改需要此升级。只有一个SQL查询无法正常工作。我收到一个错误: ER_WRONG_FIELD_WITH_GROUP

我用谷歌搜索了它,大多数答案都是:在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时,我无法得到答案。

谢谢!

1 个答案:

答案 0 :(得分:0)

此查询的基本问题是权限。在早期版本的MySQL中,您的查询将为每个用户返回一行,并对其具有任意权限。也就是说,它任意地丢弃了用户的权限。我认为这是一个错误。

这使得查询升级变得困难。

当您向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 = ? ; 添加权限时,每个用户将获得多行。这可能不是意图。一种选择是完全从查询中删除权限。另一种方法是将它们组合在一起:

{{1}}