首页 > 解决方案 > 通过链接表的 MySQL m:n 关系查询在生产 8.0.13 中返回 null 但在本地工作 5.7.30

问题描述

使用以下 MySQL 模式进行关系:

具有 PK user_id的表用户具有PK blog_id和 FK user_id标签的 表用户,具有 PK tag_id 和链接表 blog_tagPKFK作为blog_idtag_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 相比有什么影响而不破坏它?

希望它足够清楚,并感谢您的帮助。

标签: mysqljoinleft-join

解决方案


您的查询是一个聚合查询,因为JSON_ARRAYAGG()它是一个聚合函数。

你没有GROUP BY。因此, 中的所有值都SELECT应该是聚合函数的参数。如果有 a GROUP BY,则未聚合的列需要与GROUP BY键兼容。

但是,你有SELECT b.*- 所以很多列显然没有聚合。这是 SQL 中的语法错误

问题是您有一个格式错误的查询,该查询曾经使用 MySQL 中的默认设置,因为它允许此类格式错误的查询。令人高兴的是,这已在 MySQL 8+ 中修复,因此查询不起作用。


推荐阅读