假设我们有两个简单的表cars
和owners
。每辆车都有很多车主。我们可以在两个查询中使用外键来获取所有汽车及其所有者但是如何在一个查询中执行此操作?与MySQL的每个连接都相当昂贵,因此我使用data group
和json
来解决问题。
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
包含非引号(如引号或撇号),我应该准备我的查询吗?我应该考虑什么?
答案 0 :(得分:0)
这种方法有什么缺点吗?
是:
GROUP CONCAT
会将结果“截断为group_concat_max_len
系统变量给出的最大长度”(参见documentation)。处理此问题的一种方法是使用简单连接来选择所有行(按汽车排序),然后在应用程序中循环它们并在汽车更改时将它们分组(例如https://gist.github.com/theodorejb/321a389bc612b4289ccc)