簡體   English   中英

如何在SQL中將基於ID的多行存儲到php中的變量中

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

我在phpmyadmin中有3個表。 疾病表,葯物表,疾病葯物表。

案例:該疾病可以有多種葯物,這就是為什么我制作了第三個表,命名為疾病表與葯物表的疾病表。

我的問題是如何獲取該疾病的所有記錄。

我正在使用Codeigniter框架

我想要的結果是:

  • id-disease_name-葯品
  • 1-牙痛-med1,med2,med3,med4
  • 2-頭痛-med4,med8,med2,med5

還是您有一個更好的主意來解決我的問題?

這是我的病情表

  • id(int11)
  • disease_name(varchar255)

這是我的葯桌

  • id(int11)
  • med_name(varchar255)
  • 劑量強度(varchar255)
  • 價格(十進制65,2)

這是我的病

  • id(int11)
  • disease_id(int11)
  • medicine_id(int11)
  • 劑量(varchar255)
  • 數量(int64)

我將在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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM