首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码点火器中用逗号分隔的值连接查询

代码点火器中用逗号分隔的值连接查询
EN

Stack Overflow用户
提问于 2015-12-02 18:53:04
回答 1查看 2.5K关注 0票数 1

我的桌子结构就像

代码语言:javascript
复制
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“表和连接表"crm_mr_doctor”和"crm_product“获取数据,连接条件如下

代码语言:javascript
复制
crm_mrdetails.mr_doctor = crm_mr_doctor.id 
crm_mr_doctor.product = crm_product.id

但是列中有一个逗号分隔的值,我需要以下面的方式输出。

输出:

代码语言:javascript
复制
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
                                              ) 
                                         )

                            )
                       )
         )
)

我需要用代码点火器写查询才能得到上面的输出--请帮助我实现这个结果,谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-03 13:53:58

问题

正如@Liam Sorsby@blckbird在其中提到的那样,您应该使用规范化规则。使用逗号分隔的值不是一种好方法,而且当数据大小增加时,您的表将变得更加复杂。

想象一下,“约翰”(John) (with id=1)有很多医生,所以你的桌子应该是这样的:

代码语言:javascript
复制
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)之间的关系。

  1. 你必须弄到所有与珍有血缘关系的医生名单
  2. 爆炸结果
  3. 搜索id=5
  4. 移除
  5. 内爆结果
  6. 把它保存到餐桌上。

其他操作,如搜索医生和用户是否有关系,添加新的关系和删除现有的关系变得更加复杂使用这种架构。

最佳解决方案:

从当前的场景来看,用户和医生之间似乎存在着many-to-many关系,也就是说,“医生可以有很多病人,而病人可以属于许多医生”

在这种情况下,您应该使用“枢轴表”来维护两个表之间的关系。在你的例子中,它应该是这样的:

表名: crm_mrdetails

代码语言:javascript
复制
id | mr_name | me_email     | mr_mobile    |
 ------------------------------------------+
 1  | John    |abc@gmail.com | 9876543210  |

表名: crm_mr_doctor

代码语言:javascript
复制
id | dr_name     | specialization  |
-----------------------------------+
1  | Abhishek    | cordiologist    |
2  | Krishnan    | Physician       |

现在,您将有一个数据透视表来维护两个表之间的关系:

表名: crm_doctor_mr

代码语言:javascript
复制
id | dr_id     | mr_id  |
---------------+--------+
1  |  1        |   1    |
2  |  2        |   1    |

对于产品和医生的关系,我们也会做同样的事情。

产品和医生也有many-to-many关系--“一个产品属于许多医生,一个医生有很多产品。”

因此,您将拥有这样一个产品表:

表名: crm_product

代码语言:javascript
复制
   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_doctors_products

代码语言:javascript
复制
id | dr_id      | product_id |
----------------+------------+
1  |    1       |   1        |
2  |    1       |   2        |
3  |    2       |   2        |
4  |    2       |   4        |
5  |    2       |   5        |

一旦您在数据库中进行了更改,您就可以使用简单连接查询任何记录。

另一个解决方案

如果您所处的阶段无法对DB进行更改,则可以使用此解决方案,但我更喜欢上面的解决方案。

代码语言:javascript
复制
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;

}

但是,此解决方案将导致多个查询在数据库上运行,并将随着上表中数据大小的增加而成倍地影响性能。

希望这会有帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34050713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档