在 codeigniter 中使用逗号分隔值加入查询
Join query with comma separated values in codeigniter
我有一个 table 结构,如
Table Name : crm_mrdetails
id | mr_name | me_email | mr_mobile | mr_doctor|
-------------------------------------------------
1 | John |abc@gmail.com | 9876543210 | 1,2 |
Table Name : crm_mr_doctor
id | dr_name | specialization| product |
--------------------------------------------
1 | Abhishek | cordiologist | 1,2 |
2 | Krishnan | Physician |2,4,5 |
Table Name: crm_product
id | product_name | unit| pts |
--------------------------------
1 | Crocin | 50 | 50 |
2 | Crocin2 | 60 | 100 |
3 | Crocin3 | 30 | 90 |
4 | Crocin4 | 70 | 80 |
5 | Crocin5 | 80 | 50 |
我需要从"crm_mrdetails"table获取数据并加入table"crm_mr_doctor"和"crm_product",加入条件如
crm_mrdetails.mr_doctor = crm_mr_doctor.id
crm_mr_doctor.product = crm_product.id
但是列中有逗号分隔值,我需要按以下方式输出。
输出:
Array
(
[0] => stdClass Object
(
[id] => 1
[mr_name] => john
[mr_email] => abc@gmail.com
[mr_mobile] => 9876543210
[doctor] =>([0]=>stdClass Object
(
[id] => 1
[dr_name] => Abhishek
[product] =>([0]=>stdClass Object
(
[id] => 1
[product_name] => crocin
[unit] => 50
[pts] => 50
)
[1]=>stdClass Object
(
[id] => 2
[product_name] => crocin2
[unit] => 60
[pts] => 100
)
)
)
[1]=>stdClass Object
(
[id] => 1
[dr_name] => Krishnan
[product] =>([0]=>stdClass Object
(
[id] => 2
[product_name] => crocin2
[unit] => 60
[pts] => 100
)
[1]=>stdClass Object
(
[id] => 2
[product_name] => crocin4
[unit] => 70
[pts] => 80
)
[2]=>stdClass Object
(
[id] => 2
[product_name] => crocin5
[unit] => 80
[pts] => 50
)
)
)
)
)
)
我需要在 codeigniter 中编写查询以获得如上所示的输出请帮助我实现这个结果,谢谢
问题
正如评论中提到的 @Liam Sorsby
和 @blckbird
您应该使用规范化规则。使用逗号分隔值不是一个好方法,当数据量增加时,您的 table 将变得更加复杂。
想象一下 "John" (with id=1)
有很多医生,所以你的 table 会是这样的:
id | mr_name | me_email | mr_mobile | mr_doctor |
-----------------------------------------------------------------+
1 | John |abc@gmail.com | 9876543210 | 1,2,5,6,8,9,10,11,78 |
现在想象一下,您想要删除医生 id=5
和 Jhon (user with id=1)
之间的关系
- 您将必须获得与 Jhon 相关的所有医生的列表
- 分解结果
- 搜索
id=5
- 删除它
- 内爆结果
- 将其保存到 table。
搜索医生和用户是否有关系、添加新关系和删除现有关系等其他操作使用此架构变得更加复杂。
最佳解决方案:
从目前的情况来看,用户和医生之间似乎存在 many-to-many
关系,即 "A doctor can have many Patients and a Patient can belong to many doctors"
在这种情况下,您应该使用 "pivot table" 来维持两个 table 之间的关系。在您的情况下,它将是这样的:
Table 姓名:crm_mrdetails
id | mr_name | me_email | mr_mobile |
------------------------------------------+
1 | John |abc@gmail.com | 9876543210 |
Table 姓名:crm_mr_doctor
id | dr_name | specialization |
-----------------------------------+
1 | Abhishek | cordiologist |
2 | Krishnan | Physician |
现在您将有一个 Pivot table 来维护两个 table 之间的关系 :
Table 姓名:crm_doctor_mr
id | dr_id | mr_id |
---------------+--------+
1 | 1 | 1 |
2 | 2 | 1 |
对于产品和医生的关系,也会做同样的事情。
产品和医生也有 many-to-many
关系-
"A product belongs to many doctors and a doctor has many products."
所以你会有这样的产品 table :
Table 姓名:crm_product
id | product_name | unit| pts |
---+--------------+-----+-----+
1 | Crocin | 50 | 50 |
2 | Crocin2 | 60 | 100 |
3 | Crocin3 | 30 | 90 |
4 | Crocin4 | 70 | 80 |
5 | Crocin5 | 80 | 50 |
和一个支点table保持关系:
Table 姓名:crm_doctors_products
id | dr_id | product_id |
----------------+------------+
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 2 |
4 | 2 | 4 |
5 | 2 | 5 |
在您的数据库中进行更改后,您可以使用简单的联接查询任何记录。
另一个解决方案
如果您处于无法更改数据库的阶段,您可以使用此解决方案,但我更喜欢上面的解决方案。
public function get_mr_details(){
$mrArray = $this->db->get('crm_mrdetails')->result();
foreach($mrArray as &$mr){
$mr['doctor'] = $this->db->where_in('id',$mr['mr_doctor'])->get('crm_mr_doctor')->result();
foreach($mr['doctor'] as &$dr){
$dr['product'] = $this->db->where_in('id',$dr['product'])->get('crm_product')->result();
}
unset($mr['mr_doctor']);
}
return $mrArray;
}
但是,此解决方案将导致对数据库 运行 进行多次查询,并且会随着数据大小的增加在 table 秒以上以指数方式影响性能。
希望对您有所帮助!!!
我有一个 table 结构,如
Table Name : crm_mrdetails
id | mr_name | me_email | mr_mobile | mr_doctor|
-------------------------------------------------
1 | John |abc@gmail.com | 9876543210 | 1,2 |
Table Name : crm_mr_doctor
id | dr_name | specialization| product |
--------------------------------------------
1 | Abhishek | cordiologist | 1,2 |
2 | Krishnan | Physician |2,4,5 |
Table Name: crm_product
id | product_name | unit| pts |
--------------------------------
1 | Crocin | 50 | 50 |
2 | Crocin2 | 60 | 100 |
3 | Crocin3 | 30 | 90 |
4 | Crocin4 | 70 | 80 |
5 | Crocin5 | 80 | 50 |
我需要从"crm_mrdetails"table获取数据并加入table"crm_mr_doctor"和"crm_product",加入条件如
crm_mrdetails.mr_doctor = crm_mr_doctor.id
crm_mr_doctor.product = crm_product.id
但是列中有逗号分隔值,我需要按以下方式输出。
输出:
Array
(
[0] => stdClass Object
(
[id] => 1
[mr_name] => john
[mr_email] => abc@gmail.com
[mr_mobile] => 9876543210
[doctor] =>([0]=>stdClass Object
(
[id] => 1
[dr_name] => Abhishek
[product] =>([0]=>stdClass Object
(
[id] => 1
[product_name] => crocin
[unit] => 50
[pts] => 50
)
[1]=>stdClass Object
(
[id] => 2
[product_name] => crocin2
[unit] => 60
[pts] => 100
)
)
)
[1]=>stdClass Object
(
[id] => 1
[dr_name] => Krishnan
[product] =>([0]=>stdClass Object
(
[id] => 2
[product_name] => crocin2
[unit] => 60
[pts] => 100
)
[1]=>stdClass Object
(
[id] => 2
[product_name] => crocin4
[unit] => 70
[pts] => 80
)
[2]=>stdClass Object
(
[id] => 2
[product_name] => crocin5
[unit] => 80
[pts] => 50
)
)
)
)
)
)
我需要在 codeigniter 中编写查询以获得如上所示的输出请帮助我实现这个结果,谢谢
问题
正如评论中提到的 @Liam Sorsby
和 @blckbird
您应该使用规范化规则。使用逗号分隔值不是一个好方法,当数据量增加时,您的 table 将变得更加复杂。
想象一下 "John" (with id=1)
有很多医生,所以你的 table 会是这样的:
id | mr_name | me_email | mr_mobile | mr_doctor |
-----------------------------------------------------------------+
1 | John |abc@gmail.com | 9876543210 | 1,2,5,6,8,9,10,11,78 |
现在想象一下,您想要删除医生 id=5
和 Jhon (user with id=1)
- 您将必须获得与 Jhon 相关的所有医生的列表
- 分解结果
- 搜索
id=5
- 删除它
- 内爆结果
- 将其保存到 table。
搜索医生和用户是否有关系、添加新关系和删除现有关系等其他操作使用此架构变得更加复杂。
最佳解决方案:
从目前的情况来看,用户和医生之间似乎存在 many-to-many
关系,即 "A doctor can have many Patients and a Patient can belong to many doctors"
在这种情况下,您应该使用 "pivot table" 来维持两个 table 之间的关系。在您的情况下,它将是这样的:
Table 姓名:crm_mrdetails
id | mr_name | me_email | mr_mobile |
------------------------------------------+
1 | John |abc@gmail.com | 9876543210 |
Table 姓名:crm_mr_doctor
id | dr_name | specialization |
-----------------------------------+
1 | Abhishek | cordiologist |
2 | Krishnan | Physician |
现在您将有一个 Pivot table 来维护两个 table 之间的关系 :
Table 姓名:crm_doctor_mr
id | dr_id | mr_id |
---------------+--------+
1 | 1 | 1 |
2 | 2 | 1 |
对于产品和医生的关系,也会做同样的事情。
产品和医生也有 many-to-many
关系-
"A product belongs to many doctors and a doctor has many products."
所以你会有这样的产品 table :
Table 姓名:crm_product
id | product_name | unit| pts |
---+--------------+-----+-----+
1 | Crocin | 50 | 50 |
2 | Crocin2 | 60 | 100 |
3 | Crocin3 | 30 | 90 |
4 | Crocin4 | 70 | 80 |
5 | Crocin5 | 80 | 50 |
和一个支点table保持关系:
Table 姓名:crm_doctors_products
id | dr_id | product_id |
----------------+------------+
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 2 |
4 | 2 | 4 |
5 | 2 | 5 |
在您的数据库中进行更改后,您可以使用简单的联接查询任何记录。
另一个解决方案
如果您处于无法更改数据库的阶段,您可以使用此解决方案,但我更喜欢上面的解决方案。
public function get_mr_details(){
$mrArray = $this->db->get('crm_mrdetails')->result();
foreach($mrArray as &$mr){
$mr['doctor'] = $this->db->where_in('id',$mr['mr_doctor'])->get('crm_mr_doctor')->result();
foreach($mr['doctor'] as &$dr){
$dr['product'] = $this->db->where_in('id',$dr['product'])->get('crm_product')->result();
}
unset($mr['mr_doctor']);
}
return $mrArray;
}
但是,此解决方案将导致对数据库 运行 进行多次查询,并且会随着数据大小的增加在 table 秒以上以指数方式影响性能。
希望对您有所帮助!!!