【问题标题】:Why does my complex 'mysql' query always returns query result 'count' as 0?为什么我的复杂 'mysql' 查询总是返回查询结果 'count' 为 0?
【发布时间】:2017-12-12 03:37:16
【问题描述】:

我正在编写过滤器搜索代码,其中用户从 3 个复选框的列表中选择至少一个选项,然后我必须为所选选项(复选框)编写查询。如果我尝试运行我的代码,那么我会得到“查询结果计数为零,这意味着 $count=0”。以前我第一次编写代码时它运行良好,但现在它无法运行。

我的表格是:

<form id="my_form_id" method="post" action="{{ action('MyController@store') }}"">
<div class="form-group">
  <label><input type="checkbox" value="suppliers" name="suppliers">suppliers</label>
</div>
<div class="form-group">
  <label><input type="checkbox" value="campaign" name="campaign">campaign</label>
</div>
<div class="form-group">
  <label><input type="checkbox" value="clients" name="clients">clients</label>
</div>
<div class="form-group">
  <label for="start_date">From:</label><input type="text" name="startdate" id="startdate">
</div>
<div class="form-group">
  <label for="start_date">From:</label><input type="text" name="enddate" id="enddate">
</div>
<div class="form-group">
  <button type="submit" id="process" class="btn btn-primary submit">Run Report</button>
</div>

MySql 表结构&数据为:lead_audit

结构:

ColumnName  DataType  Length
  id         int      11
supplier_id  int      11
source       varchar  255
client_id    int      11
campaign_id  varchar  255
data         text 
received     datetime
errors       blob
disposition  varchar  255

id  supplier_id  source  client_id  campaign_id  data  received       errors  disposition
1   6            6          1       56           ---   2017-07-07 11:19:25  False  Accepted
1   6            6          1       56           ---   2017-07-07 11:19:25  False  Accepted

我的查询如下:

if(isset($request->suppliers) && $request->suppliers == 'suppliers'){
            $results->leftjoin('suppliers AS s', 's.id', '=', 'l.supplier_id')
                    ->addSelect('s.name AS Supplier')
                    ->groupBy('s.name')
                    ->orderBy('s.name');
}
if(isset($request->source) && $request->source == 'source'){
            $results->addSelect('l.source AS Source')
                    ->groupBy('l.source')
                    ->orderBy('l.source');
            //$results->leftjoin('source AS so', 'so.id', '=', 'l.source_id')
}
if(isset($request->campaign) && $request->campaign == 'campaign'){
            $results->leftjoin('campaigns AS c', 'c.id', '=', 'l.campaign_id')
                    ->addSelect('c.name AS Campaign')
                    ->groupBy('c.name')
                    ->orderBy('c.name');
}    
if(isset($request->clients) && $request->clients == 'clients'){
            $results->leftjoin('clients AS cl', 'cl.id', '=', 'l.client_id')
                    ->addSelect('cl.name AS Client')
                    ->groupBy('cl.name')
                    ->orderBy('cl.name');
} 
$queryResults = $results->addSelect('l.disposition AS Disposition')
                ->selectRaw('COUNT(*) as Count')
                ->whereBetween('l.received', [$start, $end])
                ->groupBy('l.disposition')
                ->orderBy('l.disposition')
                ->get()->toArray();
$count = count($queryResults);
echo "Count: ".$count;exit;

if($count > 0){
  $results = array_map(function($item) {
            return (array)$item;
        }, $queryResults);
  return Excel::create('my_excel_name', function($excel) use ($results) {
            $excel->sheet('sheet_name', function($sheet) use ($results) {
                $sheet->fromArray($results);
            });
        })->setFilename($filename)
        ->download('csv');
} else{
        \Session::flash('error','No data has been found.');
        return redirect('my_controller/create');
    }

结果查询是:

array:1 [▼
0 => array:3 [▼
"query" => "select `s`.`name` as `Supplier`, `l`.`source` as `Source`, `c`.`name` as `Campaign`, `cl`.`name` as `Client`, `l`.`disposition` as `Disposition`, COUNT(*) as Count from `lead_audit` as `l` left join `suppliers` as `s` on `s`.`id` = `l`.`supplier_id` left join `campaigns` as `c` on `c`.`id` = `l`.`campaign_id` left join `clients` as `cl` on `cl`.`id` = `l`.`client_id` where `l`.`received` between ? and ? group by `s`.`name`, `l`.`source`, `c`.`name`, `cl`.`name`, `l`.`disposition` order by `s`.`name` asc, `l`.`source` asc, `c`.`name` asc, `cl`.`name` asc, `l`.`disposition` asc ◀"
"bindings" => array:2 [▼
  0 => "2017-07-01"
  1 => "2017-07-08"
]
"time" => 149.01
]
]

If I print below:
print_r($queryResults);
echo "Count: ".$count;exit;

then o/p
  Array ( ) Count: 0

为什么我得到的 $count 值总是“0”。我的代码有什么问题?

【问题讨论】:

  • 添加输出查询:当您不知道自己输入了什么时,读取一堆 if 语句并没有真正奏效。另外:减少到实际上只是那个查询。最后:一旦你有查询,添加一个数据示例
  • 查询本身看起来不错。您可能对定义两个比较日期的方式有疑问,请查看此帖子:stackoverflow.com/questions/10398921/…
  • 感谢您的回复。我也添加了表格结构。通常 mysql 以 YYYY-MM-DD 存储日期格式,我也在检查相同的日期格式。有趣的是,它在本地服务器上运行良好,但在我们的服务器上运行不正常。
  • 看到“本地服务器”和“您的服务器”似乎有不同的行为,您是否尝试过以 ISO 格式 (between '20170701' AND '20170708') 指定日期?
  • 感谢您的回复,但运气不好,它不起作用。如果我在 mysql 服务器中运行相同的查询,那么它不会显示任何错误,而是给出空结果。

标签: mysql search filter laravel-5.4 laravel-query-builder


【解决方案1】:

现在发布答案为时已晚,但我希望这可以帮助某人。我犯的错误是给出开始日期和结束日期格式,如下所示:

问题:

$start = "2017-07-01"
$end = "2017-07-08"

但实际上我必须提供如下输入:

解决方案:

$start = "2017-07-01 00:00:00"
$end = "2017-07-08 00:00:00"

在开始和结束日期添加时间为“00:00:00”后,我的问题得到解决。谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2020-05-04
    • 2017-01-17
    • 2011-04-04
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多