通过链接表的MySQL m:n关系查询在生产8.0.13中返回null,但在本地5.7.30起作用

问题描述 投票:-1回答:1

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

user和PK user_idblog与PK blog_id和FK user_idtag与PK tag_id并将表blog_tag与PK和FK链接为blog_idtag_id(均已删除级联)]

1]在带有Node(12.16.2),Express(4.17.1)和mysql(2.18.2)的Ubuntu 18.04.1上进行本地开发时,以下查询在使用mysql服务器5.7.30(如果是客户端14.14,则为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中工作?与JOIN相比,LEFT JOIN会产生什么影响而不破坏它?

希望它很清楚,感谢您的帮助。

mysql join left-join
1个回答
0
投票
您没有GROUP BY。因此,SELECT中的所有值都应该是聚合函数的参数。如果有GROUP BY,则未聚合的列将需要与GROUP BY键兼容。

但是,您有SELECT b.*,因此很显然没有汇总许多列。这是SQL中的语法错误

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

© www.soinside.com 2019 - 2024. All rights reserved.