2016-07-22 103 views
0

我在phpmyadmin中有3個表。 disease_table,medicine_table,disease_medicine_table。如何在SQL中將多行數據庫存儲到變量中

病例:該病可以有多種藥物,這就是爲什麼我製作了第三張名爲disease_medicine表格的表格,該表格連接了疾病表格和藥物表格。

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

我用笨框架

我期望的結果是:

  • ID - disease_name - 藥品
  • 1 - 牙痛 - MED1,MED2,med3,med4
  • 2 - 頭痛 - med4,med8,med2,med5

或者您是否有更好的主意來解決我的問題?

這是我的疾病表

  • ID(INT11)
  • disease_name(varchar255)

這是我的藥表

  • ID(INT11)
  • med_name (varchar255)
  • dosage_strength(varchar255)
  • 價格(decimal65,2)

這是我disease_medicine表

  • ID(INT11)
  • disease_id(INT11)
  • medicine_id(INT11)
  • 用量(varchar255)
  • 數量(int64)

Im去顯示在數據表服務器側的數據,這是我的代碼 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; 
} 

預先感謝

+1

哪個DBMS實際使用的是mysql <> sql-server。 –

+0

你存儲哪種藥物需要一個「小數(65,2)」的價格? – HoneyBadger

+0

@HoneyBadger笑lol – BeetleJuice

回答

0

運行查詢:

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()刪除尾隨逗號。

+0

我得到這個錯誤'不能使用stdClass類型的對象作爲數組' –

+0

這與您如何從您的查詢結果中獲取數據有關。查看不同的提取選項。通常有3:1)作爲關聯數組獲取(這就是我的答案所假設的),2)作爲索引數組獲取,3)作爲對象獲取。如果你正在處理對象,你可以很容易地調整代碼,例如用'$ row-> med_name'替換'$ row ['med_name']'' – BeetleJuice

+0

我將在數據表服務器端代碼中顯示它,並返回數組的結果如你所說,我得到這個錯誤'不能使用類型爲stdClass的對象作爲數組' –

0

嘗試:

$ diseasesWithMedicines = $這 - > 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(); 
} 
相關問題