将多个 Mysql 语句分组以获取多个状态的计数
Grouping multiple Mysql statements to fetch count of multiple statuses
目前我正在使用 Mysql 和 CodeIgniter 在特定时间范围内从我的数据库中获取我的条目。每个条目在数据库中的状态为 D、N、Y。现在要显示此数据,我对每个状态都有不同的语句,我想将其分组为 1 个语句。
型号Class:
public function get_records_draft($st_date,$end_date){
$this->db->select('*');
$this->db->from('crm_listings');
$this->db->where('cast(added_date as date) BETWEEN "' . $st_date . '" AND "' . $end_date . '" AND status= "D"');
return $this->db->get();
}
public function get_records_unpublish($st_date,$end_date){
$this->db->select('*');
$this->db->from('crm_listings');
$this->db->where('cast(added_date as date) BETWEEN "' . $st_date . '" AND "' . $end_date . '" AND status= "N"');
return $this->db->get();
}
public function get_records_publish($st_date,$end_date){
$this->db->select('*');
$this->db->from('crm_listings');
$this->db->where('cast(added_date as date) BETWEEN "' . $st_date . '" AND "' . $end_date . '" AND status= "Y"');
return $this->db->get();
}
还有我的控制器 class,我在其中获取这些数据并以 table:
的形式显示
$data = $this->user_model->get_records_draft($startDate,$endDate);
$data1 = $this->user_model->get_records_unpublish($startDate,$endDate);
$data2 = $this->user_model->get_records_publish($startDate,$endDate);
$output .= '
<div class="table-responsive">
<table class="table table-bordered table-striped">
<tr>
<th>Draft</th>
<th>Unpublish</th>
<th>Publish</th>
</tr>
';
if($data->num_rows() > 0)
{
$output .= '
<tr>
<td>'.$data->num_rows().'</td>
<td>'.$data1->num_rows().'</td>
<td>'.$data2->num_rows().'</td>
</tr>
';
}
else
{
$output .= '<tr>
<td colspan="5">No Data Found</td>
</tr>';
}
$output .= '</table>';
echo $output;
这就是我认为的 AJAX 请求 class:
$('#alertbox').click(function(){
var startDate = $('#startDate').val();
var endDate = $('#endDate').val();
// var status = $('#status').val();
if(startDate != '' && endDate != '' ){
$.ajax({
url:"<?php echo base_url(); ?>testcontroller/fetch_status",
method:"POST",
data:{startDate:startDate, endDate:endDate},
success:function(data){
$('#result').html(data)
}
})
}else{
alert("Please enter a date");
}
})
我的问题是,是否可以将所有这些组合成 1 个方法,在我的控制器 class.
的特定标题中 class 验证它们
我已经尝试在 phpmyadmin 中使用以下查询,它给出了我正确的输出,但我不知道如何在我的模型和控制器中执行相同的操作 class:
SELECT COUNT(status) FROM `crm_listings` WHERE added_date BETWEEN '2021-09-23' AND '2021-09-29' GROUP BY status
试试这个
Your models
public function summary($st_date,$end_date){
$this->db->select("
SUM(CASE WHEN status = 'D' THEN 1 END) AS Draft,
SUM(CASE WHEN status = 'N' THEN 1 END) AS Unpublish,
SUM(CASE WHEN status = 'Y' THEN 1 END) AS Publish,
"
);
$this->db->from('crm_listings');
$this->db->where('cast(added_date as date) BETWEEN "' . $st_date . '" AND "' . $end_date');
return $this->db->get();
}
控制器
....
$data = $this->user_model->summary($startDate,$endDate)->result();
echo $data->Draft;
echo $data->Unpublish;
echo $data->Publish;
使用CASE
语句而不是多个查询
型号:
public function summary($st_date,$end_date){
$this->db->select("
SUM(CASE WHEN status = 'D' THEN 1 END) AS draft,
SUM(CASE WHEN status = 'N' THEN 1 END) AS unpublish,
SUM(CASE WHEN status = 'Y' THEN 1 END) AS publish"
);
$this->db->where('added_date >=', $st_date);
$this->db->where('added_date <=', $end_date);
return $this->db->get('crm_listings');
}
查看:
不要在控制器中创建 HTML,因为这在 MVC 中是一种不好的做法。在视图文件中使用 foreach
循环来显示值
阅读来自 CI Views
的更多信息
<div class="table-responsive">
<table class="table table-bordered table-striped">
<tr>
<th>Draft</th>
<th>Unpublish</th>
<th>Publish</th>
</tr>
<?php
if(isset($data) && count($data) > 0){
foreach($data as $row ){ ?>
<tr>
<td><?= $row->draft ?></td>
<td><?= $row->unpublish ?></td>
<td><?= $row->publish ?></td>
</tr>
<?php } //Foreach end here
} else { ?>
<tr>
<td colspan="5">No Data Found</td>
</tr>
<?php } ?>
</table>
阅读更多关于 MySQL Case Statement
目前我正在使用 Mysql 和 CodeIgniter 在特定时间范围内从我的数据库中获取我的条目。每个条目在数据库中的状态为 D、N、Y。现在要显示此数据,我对每个状态都有不同的语句,我想将其分组为 1 个语句。
型号Class:
public function get_records_draft($st_date,$end_date){
$this->db->select('*');
$this->db->from('crm_listings');
$this->db->where('cast(added_date as date) BETWEEN "' . $st_date . '" AND "' . $end_date . '" AND status= "D"');
return $this->db->get();
}
public function get_records_unpublish($st_date,$end_date){
$this->db->select('*');
$this->db->from('crm_listings');
$this->db->where('cast(added_date as date) BETWEEN "' . $st_date . '" AND "' . $end_date . '" AND status= "N"');
return $this->db->get();
}
public function get_records_publish($st_date,$end_date){
$this->db->select('*');
$this->db->from('crm_listings');
$this->db->where('cast(added_date as date) BETWEEN "' . $st_date . '" AND "' . $end_date . '" AND status= "Y"');
return $this->db->get();
}
还有我的控制器 class,我在其中获取这些数据并以 table:
的形式显示$data = $this->user_model->get_records_draft($startDate,$endDate);
$data1 = $this->user_model->get_records_unpublish($startDate,$endDate);
$data2 = $this->user_model->get_records_publish($startDate,$endDate);
$output .= '
<div class="table-responsive">
<table class="table table-bordered table-striped">
<tr>
<th>Draft</th>
<th>Unpublish</th>
<th>Publish</th>
</tr>
';
if($data->num_rows() > 0)
{
$output .= '
<tr>
<td>'.$data->num_rows().'</td>
<td>'.$data1->num_rows().'</td>
<td>'.$data2->num_rows().'</td>
</tr>
';
}
else
{
$output .= '<tr>
<td colspan="5">No Data Found</td>
</tr>';
}
$output .= '</table>';
echo $output;
这就是我认为的 AJAX 请求 class:
$('#alertbox').click(function(){
var startDate = $('#startDate').val();
var endDate = $('#endDate').val();
// var status = $('#status').val();
if(startDate != '' && endDate != '' ){
$.ajax({
url:"<?php echo base_url(); ?>testcontroller/fetch_status",
method:"POST",
data:{startDate:startDate, endDate:endDate},
success:function(data){
$('#result').html(data)
}
})
}else{
alert("Please enter a date");
}
})
我的问题是,是否可以将所有这些组合成 1 个方法,在我的控制器 class.
的特定标题中 class 验证它们我已经尝试在 phpmyadmin 中使用以下查询,它给出了我正确的输出,但我不知道如何在我的模型和控制器中执行相同的操作 class:
SELECT COUNT(status) FROM `crm_listings` WHERE added_date BETWEEN '2021-09-23' AND '2021-09-29' GROUP BY status
试试这个
Your models
public function summary($st_date,$end_date){
$this->db->select("
SUM(CASE WHEN status = 'D' THEN 1 END) AS Draft,
SUM(CASE WHEN status = 'N' THEN 1 END) AS Unpublish,
SUM(CASE WHEN status = 'Y' THEN 1 END) AS Publish,
"
);
$this->db->from('crm_listings');
$this->db->where('cast(added_date as date) BETWEEN "' . $st_date . '" AND "' . $end_date');
return $this->db->get();
}
控制器
....
$data = $this->user_model->summary($startDate,$endDate)->result();
echo $data->Draft;
echo $data->Unpublish;
echo $data->Publish;
使用CASE
语句而不是多个查询
型号:
public function summary($st_date,$end_date){
$this->db->select("
SUM(CASE WHEN status = 'D' THEN 1 END) AS draft,
SUM(CASE WHEN status = 'N' THEN 1 END) AS unpublish,
SUM(CASE WHEN status = 'Y' THEN 1 END) AS publish"
);
$this->db->where('added_date >=', $st_date);
$this->db->where('added_date <=', $end_date);
return $this->db->get('crm_listings');
}
查看:
不要在控制器中创建 HTML,因为这在 MVC 中是一种不好的做法。在视图文件中使用 foreach
循环来显示值
阅读来自 CI Views
<div class="table-responsive">
<table class="table table-bordered table-striped">
<tr>
<th>Draft</th>
<th>Unpublish</th>
<th>Publish</th>
</tr>
<?php
if(isset($data) && count($data) > 0){
foreach($data as $row ){ ?>
<tr>
<td><?= $row->draft ?></td>
<td><?= $row->unpublish ?></td>
<td><?= $row->publish ?></td>
</tr>
<?php } //Foreach end here
} else { ?>
<tr>
<td colspan="5">No Data Found</td>
</tr>
<?php } ?>
</table>
阅读更多关于 MySQL Case Statement