【问题标题】:SQL Query in MySQL 5.7.17MySQL 5.7.17 中的 SQL 查询
【发布时间】:2017-03-16 09:23:08
【问题描述】:

由于 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 是 device-user-link),或者没有任何链接的设备。

我希望你能帮助我解决这个问题。除了禁用 ONLY_FULL_GROUP_BY 之外,我无法通过谷歌搜索得到答案。

谢谢!

【问题讨论】:

  • MySQL : isn't in GROUP BY的可能重复
  • users.id 在您的选择中出现两次,一次出现在 users.* 中,再次出现为 user_group_id。这不是唯一的问题,顺便说一句
  • 啊,那是为了测试。它不再在查询中@JohnHC。谢谢!您看到了哪些问题?
  • 我认为您需要将来自permission_groupsgroup by 列作为您选择的一部分。不确定在哪个版本的 MySQL 中引入了此更改,但可能是这个。 MySQL 直到最近才有 GROUP BY 的非标准实现。
  • @ŁukaszKamiński MySQL 仅更改了处理 group by 子句的 default 设置。您也可以配置早期版本的 MySQL 以符合之前的 sql 标准。

标签: mysql sql mysql-5.7


【解决方案1】:

这个查询的根本问题是权限。在早期版本的 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 = ? ;

【讨论】:

  • 感谢您的 sql!它按预期工作。唯一的错字是您在第一个 group_concat 中使用了dl,但稍后在 sql 中将其定义为ul。由于最少 6 个字符,无法对其进行编辑。 permission_groups 每个用户只有 1 行,所以这对我来说不是问题。从现在开始,我将使用此 SQL。
猜你喜欢
  • 2017-06-12
  • 2018-09-10
  • 1970-01-01
  • 2018-12-03
  • 2010-11-27
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多