简体   繁体   English

如何在SQL中将基于ID的多行存储到php中的变量中

[英]How to store multiple row base on the ID in SQL into variable in php

I have 3 tables in phpmyadmin. 我在phpmyadmin中有3个表。 disease_table, medicine_table, disease_medicine_table. 疾病表,药物表,疾病药物表。

Case: The disease can have multiple medicines that's why I made the third table named disease_medicine table that linked the disease table and medicine table. 案例:该疾病可以有多种药物,这就是为什么我制作了第三个表,命名为疾病表与药物表的疾病表。

My problem is how to get all the records of the disease. 我的问题是如何获取该疾病的所有记录。

I'm using codeigniter framework 我正在使用Codeigniter框架

My desired result is: 我想要的结果是:

  • id - disease_name - medicines id-disease_name-药品
  • 1 - toothache - med1,med2,med3,med4 1-牙痛-med1,med2,med3,med4
  • 2 - headache - med4,med8,med2,med5 2-头痛-med4,med8,med2,med5

Or do you have a better idea to fix my problem? 还是您有一个更好的主意来解决我的问题?

This is my disease table 这是我的病情表

  • id(int11) id(int11)
  • disease_name(varchar255) disease_name(varchar255)

This my medicine table 这是我的药桌

  • id(int11) id(int11)
  • med_name(varchar255) med_name(varchar255)
  • dosage_strength(varchar255) 剂量强度(varchar255)
  • price(decimal65,2) 价格(十进制65,2)

This my disease_medicine table 这是我的病

  • id(int11) id(int11)
  • disease_id(int11) disease_id(int11)
  • medicine_id(int11) medicine_id(int11)
  • dosage(varchar255) 剂量(varchar255)
  • quantity(int64) 数量(int64)

Im going to display the data in DataTable server side and this is my code Ajax controller 我将在DataTable服务器端显示数据,这是我的代码Ajax控制器

public function get_diseases_for_table() {
$data = [];

if(($ajax_data = $this->input->get()) && $this->input->is_ajax_request()) {
    extract($ajax_data);
    $data = [
        'draw' => $draw,
        'recordsTotal' => $this->diseases->get_diseases_records_total(),
        'recordsFiltered' => $this->diseases->get_diseases_records_filtered($ajax_data)
    ];

    $data['data'] = $this->diseases->get_diseases($ajax_data);
}
$this->view = FALSE;
echo json_encode($data);

} }

Model 模型

public function get_diseases_records_total() {
    $sql = 'SELECT d.id, d.disease_name, m.med_name, d.created_at ';
    $sql .= 'FROM diseases d ';
    $sql .= 'INNER JOIN diseases_medicines dm ON d.id = dm.disease_id ';
    $sql .= 'INNER JOIN medicines m ON dm.medicine_id = m.id ';

    $query = $this->db->query($sql);

    return $query->num_rows();
}

public function get_diseases_records_filtered($data) {
    extract($data);
    $params = [];

    $sql = 'SELECT d.id, d.disease_name, m.med_name, d.created_at ';
    $sql .= 'FROM diseases d ';
    $sql .= 'INNER JOIN diseases_medicines dm ON d.id = dm.disease_id ';
    $sql .= 'INNER JOIN medicines m ON dm.medicine_id = m.id ';
    $sql .= 'WHERE 1 ';

    if(!empty($search['value'])){
        $sql .= 'AND (d.id = ? ';
        $sql .= 'OR d.disease_name LIKE ? ';
        $sql .= 'OR m.med_name LIKE ? ';
        $sql .= 'OR d.created_at LIKE ?) ';
    }

    if(!empty($search['value'])){
        $params[] = $search['value'];
        $params[] = $search['value'];
        $params[] = $search['value'];
        $params[] = $search['value'];
    }

    $query = $this->db->query($sql, $params);

    return $query->num_rows();
}

public function get_diseases($data, $details = false) {
    extract($data);
    $params = [];

    $sql = 'SELECT d.id, d.disease_name, m.med_name, d.created_at ';
    $sql .= 'FROM diseases d ';
    $sql .= 'INNER JOIN diseases_medicines dm ON d.id = dm.disease_id ';
    $sql .= 'INNER JOIN medicines m ON dm.medicine_id = m.id ';
    $sql .= 'WHERE 1 ';

    if(!empty($search['value'])){
        $sql .= 'AND (d.id = ? ';
        $sql .= 'OR d.disease_name LIKE ? ';
        $sql .= 'OR m.med_name LIKE ? ';
        $sql .= 'OR d.created_at LIKE ?) ';
    }

    if(isset($order)){
        $sql .= 'ORDER BY ' . $columns[$order[0]['column']]['data'] . ' ' . strtoupper($order[0]['dir']) . ' ';//$order[0]['column']
    }
    $sql .= 'LIMIT ?, ?';

    if(!empty($search['value'])){
        $params[] = $search['value'];
        $params[] = '%' . $search['value'] . '%';
        $params[] = '%' . $search['value'] . '%';
        $params[] = '%' . $search['value'] . '%';
    }

    $params[] = (int)$start;
    $params[] = (int)$length;


    $query = $this->db->query($sql, $params);

    return ( $query->num_rows() ) ? $query->result() : FALSE;
}

Thanks in advance 提前致谢

Run this query: 运行此查询:

SELECT d.id, d.disease_name, m.med_name
FROM disease d
JOIN disease_medicine dm ON d.id=dm.disease_id
JOIN medicine m on m.id=dm.medicine_id

The result will be: 结果将是:

1    disA    med1
1    disA    med2
2    disB    med3
2    disB    med4
...

You can then work through the results to compile things as you wish. 然后,您可以根据需要遍历结果以编译事物。 For instance if you put all results in $rows 例如,如果您将所有结果放入$rows

$results = [];
foreach($rows as $row){
    if(!isset($results[$row['disease_name']]) $results[$row['disease_name']]='';
    $results[$row['disease_name']] .= ',' $row['med_name'];
}

Your $results will then look like: 您的$results将如下所示:

[
    'disA'=>'med1,med2,',
    'disB'=>'med3,med4,',
    ...
]

If you care, you can use rtrim() to remove the trailing commas. 如果需要,可以使用rtrim()删除结尾的逗号。

Try : 尝试:

$diseasesWithMedicines = $this->getAllmedicinesFromDisease(); $ diseasesWithMedicines = $ this-> getAllmedicinesFromDisease();

public function getAllmedicinesFromDisease()
{   
    // first get all disease
    $diseases = $this->getAllDisease();

    // for each disease get all medicine 
    foreach ($diseases as $key => $disease) {
        $diseases[$key]['medicines'] = $this->getAllmedicinesByDiseaseId($disease['id']);
    }

    return $diseases;
}

public function getAllDisease()
{
    $this->db->select("disease_medicine.id ,disease_table.disease_name");
    $this->db->from("disease_table");
    $this->db->group_by("disease_table.disease_name");
    $query = $this->db->get();

    if ( $query->num_rows() == 0 ) {
        throw new exception("Erro");
    }

    return $query->result_array();
}

public function getAllmedicinesByDiseaseId($diseaseId) 
{
    if (empty($diseaseId)) {
       throw new exception("Erro");
    } 

    $this->db->select("medicine_table.med_name");
    $this->db->from("disease_medicine_table");
    $this->db->join("disease_table","disease_table.id = disease_medicine_table.disease_id");
    $this->db->join("medicine_table","medicine_table.id = .disease_medicine_table.medicine_id");
    $this->db->where("disease_table.id", $diseaseId);
    $query = $this->db->get();

    if ( $query->num_rows() == 0 ) {
        throw new exception("Erro");
    }

    return $query->result_array();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM