使用json在一个查询中获得一对多关系

时间:2014-09-12 13:03:01

标签: mysql sql json

假设我们有两个简单的表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包含非引号(如引号或撇号),我应该准备我的查询吗?我应该考虑什么?

1 个答案:

答案 0 :(得分:0)

  

这种方法有什么缺点吗?

是:

  1. GROUP CONCAT会将结果“截断为group_concat_max_len系统变量给出的最大长度”(参见documentation)。
  2. 如果任何名称包含引号或以转义字符结尾,则JSON将中断。
  3. 处理此问题的一种方法是使用简单连接来选择所有行(按汽车排序),然后在应用程序中循环它们并在汽车更改时将它们分组(例如https://gist.github.com/theodorejb/321a389bc612b4289ccc