Mysql 如何使用CodeIngiter将联接表查询结果调整为所需的JSON格式
假设我们有table person和table phone,它们之间的关系是一对多 我需要通过一个查询来检索类似的结果Mysql 如何使用CodeIngiter将联接表查询结果调整为所需的JSON格式,mysql,json,codeigniter,Mysql,Json,Codeigniter,假设我们有table person和table phone,它们之间的关系是一对多 我需要通过一个查询来检索类似的结果 [ { name:"abc", lname:"def", phones:[ { dial_code="+1", number:"12345667" }, { dial_code="+1", number:"12345667"
[
{
name:"abc",
lname:"def",
phones:[
{
dial_code="+1",
number:"12345667"
},
{
dial_code="+1",
number:"12345667"
}
]
},
{
name:"xyz",
lname:"lmn",
phones[
{
dial_code="+2",
number:"2643525"
}
]
},
{...}
]
我可以通过多个查询来实现这一点,比如首先获取所有人,然后逐个获取他们的手机,但我认为这太奇怪了,需要很多时间,而且会降低性能。若我通过连接表获得所有数据,那个么它就不会像这个JSON格式
任何想法都将不胜感激
对不起,我的英语不好。首先,您无法通过一个查询在每个人的手机中检索所需的结果 现在,如果有大量数据,在person循环中运行查询将极大地影响脚本的性能。通过这种方式,首先,您需要执行一个查询来获取所有personsay n个人。然后,您必须再次循环所有n个人以获取各自的电话。 因此,您需要在$persons循环内运行如下内容n次: 因此,您需要以这种方式执行n+1查询 为了克服这个n+1查询问题,我们可以应用一种称为“渴望加载”的方法。在这里,您还需要执行第一个查询来检索所有人员,然后编写一个查询来检索属于这些检索人员的所有电话:
SELECT * FROM person
结果$人:
id name
5 John
10 Bob
20 Jenna
SELECT * FROM phone WHERE person_id IN (5,10,20)
结果$电话:
id person_id dial_code number
1 5 +2 12345
2 10 +1 12312
3 20 +1 98765
现在,我们将这两个结果合并到PHP脚本中,以生成所需的数组。这样,我们只编写两个查询,而不是n+1个查询
可以编写如下所示的PHP脚本来组合两个结果集:
// Create an array of phones with person_id as key
$phones_with_person_id_as_key = [];
foreach($phones as $key => $phone) {
$phones_with_person_id_as_key[$phone->person_id][$key] = $phone;
}
// Loop $persons array and add phones to person object
foreach($persons as $key => $person) {
// create phones key and add data
if (!empty($phones_with_person_id_as_key[$person->id])) {
$person->phones = $phones_with_person_id_as_key[$person->id];
}
else {
$person->phones = [];
}
}
现在,$persons包含格式化的所需输出。即使您不知道如何做-@至少提供所需的数据表关系ID等。无论如何,尝试一种方法-如果您不尝试任何操作,在这里很难得到答案。。。你已经成为会员2年了,我想向你提出要求是合理的that@sintakonte我提到,我这样做是通过首先获取所有人,然后循环这些人并检索电话。我只是想知道是否可以通过减少查询数量来提高性能。我不知道我还应该提供什么数据?你说首先我需要获取所有的人,然后检索他们的ID,并使用IN子句进行另一次查询,以获取电话,然后检查哪些电话属于每个人?确切地说,您总共运行了两个查询,然后编写了一些脚本,以准备密钥中包含嵌套电话数据的person数组。以下是Laravel framework的文档链接,其中内置methodwith:
// Create an array of phones with person_id as key
$phones_with_person_id_as_key = [];
foreach($phones as $key => $phone) {
$phones_with_person_id_as_key[$phone->person_id][$key] = $phone;
}
// Loop $persons array and add phones to person object
foreach($persons as $key => $person) {
// create phones key and add data
if (!empty($phones_with_person_id_as_key[$person->id])) {
$person->phones = $phones_with_person_id_as_key[$person->id];
}
else {
$person->phones = [];
}
}