2014-09-12 193 views
2

我们假设我们有两个简单表carsowners。每辆车可以有很多车主。我们可以在两次查询中使用外键获取所有车辆及其车主,但在单一查询中如何操作呢?与MySQL的每个连接都相当昂贵,所以我使用data groupjson来解决问题。使用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

是的,首先阅读[* docs *](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) – 2014-09-12 13:04:57

回答

0

这种方法有什么缺点吗?

是:

  1. GROUP CONCAT将截断结果 “到由所述group_concat_max_len系统变量给定的最大长度”(见documentation)。
  2. 如果任何名称包含引号或以换码符结束,JSON将会中断。而不是来处理这

一种方式是通过他们在您的应用程序中使用一个简单连接,选择所有行(车程顺序),然​​后循环,并将其分成组,当汽车改变(例如https://gist.github.com/theodorejb/321a389bc612b4289ccc)。

相关问题