如何根据 SQL 中的 ID 将多行存储到 php 中的变量中

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

我在 phpmyadmin 中有 3 个 table。 disease_table, medicine_table, 疾病_medicine_table.

案例:疾病可以有多种药物,所以我做了第三个table命名为disease_medicinetable,将疾病table和药物[=88=联系起来] ].

我的问题是如何获取疾病的所有记录。

我正在使用 codeigniter 框架

我想要的结果是:

或者你有更好的办法来解决我的问题吗?

这是我的病table

这是我的药table

这是我的disease_medicinetable

我要在 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);

}

型号

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;
}

提前致谢

运行 这个查询:

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

结果将是:

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

然后您可以根据需要对结果进行编译。例如,如果您将所有结果放入 $rows

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

您的 $results 将如下所示:

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

如果您愿意,可以使用 rtrim() 删除结尾的逗号。

尝试:

$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();
}