由于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
时,我无法得到答案。
谢谢!
答案 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}}