如何根据 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 框架
我想要的结果是:
- id - disease_name - 药品
- 1 - 牙痛 - med1,med2,med3,med4
- 2 - 头痛 - med4、med8、med2、med5
或者你有更好的办法来解决我的问题吗?
这是我的病table
- id(int11)
- disease_name(varchar255)
这是我的药table
- id(int11)
- med_name(varchar255)
- dosage_strength(varchar255)
- 价格(小数65,2)
这是我的disease_medicinetable
- 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();
}
我在 phpmyadmin 中有 3 个 table。 disease_table, medicine_table, 疾病_medicine_table.
案例:疾病可以有多种药物,所以我做了第三个table命名为disease_medicinetable,将疾病table和药物[=88=联系起来] ].
我的问题是如何获取疾病的所有记录。
我正在使用 codeigniter 框架
我想要的结果是:
- id - disease_name - 药品
- 1 - 牙痛 - med1,med2,med3,med4
- 2 - 头痛 - med4、med8、med2、med5
或者你有更好的办法来解决我的问题吗?
这是我的病table
- id(int11)
- disease_name(varchar255)
这是我的药table
- id(int11)
- med_name(varchar255)
- dosage_strength(varchar255)
- 价格(小数65,2)
这是我的disease_medicinetable
- 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();
}