我们有数以百计的员工和跟踪每个员工的数据,我正在使用以下代码:
runSelectQuery($sqldelivery9);
$numrowsresultdelivery9 =$resultdeliverys9[0]['count'];
echo $numrowsresultdelivery9;而且,我正在跟踪每个员工的<#>last 7天记录,所以它将是100*7= 700 SQL查询。这可以接受吗?这会影响业绩吗?是否有更好的方法来处理minimal SQL查询?
发布于 2018-09-10 08:02:07
绝对不是那么回事。您可以在一个查询中完成所有这些。
SELECT employeename, DATE(reattemptdate) as date, COUNT(*) as count
FROM orders
WHERE employeename in ('name1', 'name2', 'name3', '...')
AND DATE(reattemptdate) > DATE(NOW() - INTERVAL 7 DAY)
GROUP BY employeename, date这将以以下形式提供数据:
name1 | 2018-09-05 | 5
name1 | 2018-09-06 | 7
name1 | 2018-09-07 | 12
name1 | 2018-09-08 | 9
name1 | 2018-09-09 | 22
name2 | 2018-09-05 | 3
name2 | 2018-09-06 | 5
name2 | 2018-09-07 | 9
name2 | 2018-09-08 | 11
name2 | 2018-09-09 | 16
...您所需要的只是迭代数据。
当然,如果要搜索所有雇员,而不只是搜索“特定n”雇员,则可以删除employeename in ('name1', 'name2', 'name3', '...')条件。
发布于 2018-09-10 08:19:36
您需要的查询如下
SELECT emploee_name, DATE(reattemptdate), count(*) cnt
FROM orders WHERE DATE(reattemptdate) > DATE(NOW() - INTERVAL 7 DAY)
GROUP BY emploee_name, DATE(reattemptdate)但是,它的性能可能比700个单独查询的性能差。必须谨慎地创建索引,使用emploee_name、DATE(重试日期)以及它的最后一个元素。为此,您可能需要创建一个由结果日期(重试日期)组成的单独列。
为了在PHP中方便地获得结果,您可以使用普通的PDO,这比您目前使用的任何东西都要好得多。
$sql = "SELECT emploee_name, DATE(reattemptdate), count(*) cnt
FROM orders WHERE DATE(reattemptdate) > DATE(NOW() - INTERVAL 7 DAY)
GROUP BY emploee_name, DATE(reattemptdate)";
$data = $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP);将为您提供一个方便的数组,其中的数据将是按员工名称分组,您只需使用嵌套的foreach迭代即可。
https://codereview.stackexchange.com/questions/203453
复制相似问题