【问题标题】:Fast query to load specific data column快速查询以加载特定数据列
【发布时间】:2021-03-15 13:37:53
【问题描述】:

我有这种用于试剂盒结果计数的输出格式:

   $out = array(
            'in progress' => 0,
            're-testing' => 0,
            'rejected' => 0,
            'negative' => 0,
            'positive' => 0,
            'inconclusive' => 0,
            'failed' => 0,
            'tested' => 0,
            'available' => 0,
            'total' => 0
        );

我实现了一个循环来查询套件,然后检查结果值的对应关系,如下所示:

$kits = Kit::where('customerId', Auth::id())->get();
foreach ($kits as $kit) {
    if($kit->result !== '' && isset($out[$kit->result])){
        ++$out[$kit->result];
        ++$out['tested'];
    }
    if($kit->status == 'accepted' && !$kit->result){
        ++$out['in progress'];
    }
    ++$out['total'];
}

不幸的是,这个解决方案非常慢。你对如何做到这一点有什么建议吗?谢谢。

编辑:因为项目太多,所以速度很慢。

【问题讨论】:

  • 解决方案很慢是什么意思?是在查询端还是在对象的迭代端?
  • 最快的方法几乎肯定是将逻辑放入单个 SQL 查询中,让数据库代表您完成。但如果这不是一个选项,您将不得不定义“慢”并为代码的各个部分提供一些时间。是慢的where,还是循环?循环中有多少项?
  • @hppycoder 很慢,因为数据库中有很多套件。如何实现单个查询?
  • 太好了,那么这与其说是 PHP 问题,不如说是 MySQL 问题?你的表结构是什么?

标签: php database laravel eloquent


【解决方案1】:

首先您使用条件customerId 进行查询,因此向customerId 字段添加索引将大大提高查询性能。

那你就不用统计总数了,可以用count()

$out['total'] = Kit::where('customerId', auth()->id())->count();

计算结果组++$out[$kit->result];的部分看起来可以用groupBy()完成

$kits = Kit::where('customerId', auth()->id())
    ->groupBy('result')
    ->select('result', DB::raw('COUNT(*) as no'))
    ->get();

然后对于您要计算的每个结果,您可以使用firstWhere() 查找。

$out['positive'] = $kits->firstWhere('result', 'positive')->no;
$out['negative'] = $kits->firstWhere('result', 'negative')->no;
...

$out['tested'] 只是所有计数的总和。

$out['tested'] = $out['positive'] + $out['negative'] +...

并且需要另一个查询$out['in progress']

$out['in progress'] = Kit::where('customerId', auth()->id())
    ->where('status', 'accepted')
    ->whereNotNull('result')
    ->where('result', '!=', '')
    ->count();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多