【问题标题】:Getting one to many relationship in one query using json使用json在一个查询中获取一对多关系
【发布时间】:2025-06-02 14:35:02
【问题描述】:

假设我们有两个简单的表carsowners。每辆车可以有多个车主。我们可以在两个查询中使用外键获取所有汽车及其所有者,但是在一个查询中如何呢?与 MySQL 的每个连接都相当昂贵,所以我使用 data groupjson 来解决问题。

select 
  cars.id,
  CARS.name,
  GROUP_CONCAT(CONCAT('{"id":"',owners.id,'", "name":"', owners.name, '"}')) owners
from cars
join owners 
  ON cars.id = owners.car_id
group by owners.car_id

演示:http://www.sqlfiddle.com/#!2/a62711/3

效果很好,但这种方法有什么缺点吗?我想到的一件事是对结果字段长度的一些限制。有吗?如果owners.name 包含非法字符,如引号或撇号,我是否应该准备我的查询以中断?我应该考虑什么?

【问题讨论】:

  • 是的,先读docs

标签: mysql sql json


【解决方案1】:

这种方法有什么缺点吗?

是的:

  1. GROUP CONCAT 会将结果截断为“group_concat_max_len 系统变量给出的最大长度”(请参阅​​documentation)。
  2. 如果任何名称包含引号或以转义字符结尾,则 JSON 将中断。

处理这种情况的一种方法是使用简单的连接来选择所有行(按汽车排序),然后在您的应用程序中循环它们并在汽车发生变化时将它们分成组(例如https://gist.github.com/theodorejb/321a389bc612b4289ccc)。

【讨论】:

    最近更新 更多