mysql - 通过链接表的 MySQL m:n 关系查询在生产 8.0.13 中返回 null 但在本地工作 5.7.30
问题描述
使用以下 MySQL 模式进行关系:
具有 PK user_id的表用户具有PK blog_id和 FK user_id
表标签的
表用户,具有 PK tag_id 和链接表 blog_tag与PK
和FK作为blog_id和tag_id(都在 DELETE CASCADE 上)
1) 在 Ubuntu 18.04.1 上使用 Node (12.16.2)、Express (4.17.1) 和 mysql (2.18.2) 本地开发时,以下查询使用 mysql 服务器 5.7.30 没有问题(如果重要,客户端 14.14) :
"SELECT b.*
, JSON_ARRAYAGG(JSON_OBJECT('id', t.tag_id, 'name', t.name, 'color', t.color)) AS tags
FROM blog b
JOIN blog_tag bt
ON bt.blog_id = b.blog_id
JOIN tag t
ON bt.tag_id = t.tag_id
WHERE b.blog_id = ?", [req.params.blog_id]
这适用于显示页面,它返回单个博客以及标签数组作为 json 对象。在本地运行良好。
针对生产数据库(Clever Cloud MySQL 插件 mysql 服务器 8.0.13)运行时,上面的 show 查询返回每列null的结果。为什么??
2)当使用上面的精确查询但更改为 LEFT JOIN 而不是 JOIN 时,它在生产中工作正常。为什么 JOIN 在 MySQL 5 而不是 MySQL 8 中工作,LEFT JOIN 与 JOIN 相比有什么影响而不破坏它?
希望它足够清楚,并感谢您的帮助。
解决方案
您的查询是一个聚合查询,因为JSON_ARRAYAGG()
它是一个聚合函数。
你没有GROUP BY
。因此, 中的所有值都SELECT
应该是聚合函数的参数。如果有 a GROUP BY
,则未聚合的列需要与GROUP BY
键兼容。
但是,你有SELECT b.*
- 所以很多列显然没有聚合。这是 SQL 中的语法错误
问题是您有一个格式错误的查询,该查询曾经使用 MySQL 中的默认设置,因为它允许此类格式错误的查询。令人高兴的是,这已在 MySQL 8+ 中修复,因此查询不起作用。
推荐阅读
- javascript - 在回调函数内部更改的全局变量的值未反映在函数外部
- python - Yaml 值在 python 3 中不可迭代
- c# - 我们如何在 ASP.NET Core 的自定义属性中访问请求上下文?
- ios - 设置两个变量后如何调用方法
- python - Python中多个while循环退出条件的模式
- visual-studio-code - 如何在 VS Code 任务中直接引用位于 .vscode/extensions/ 扩展名中的文件?
- docusignapi - docusign 支持的云提供商 - 它是否支持 AWS?
- java - 流式传输文件并在读取后移动它们
- go - 在没有互斥体的情况下同时读取或写入时会发生什么
- javascript - 如何在 MacOS 上获得可用(免费 + 可清除)磁盘空间?