php - MySQL 查询优化以获得每月报告
问题描述
我需要优化查询。脚本返回一个简单的表格结果,如下所示。
我想加快结果,也许一种解决方案是将 montly 查询合并到一个中。
以良好的速度获得列表的最佳和正确方法是什么?
桌子
YAER 2018
ID NAME JAN FEV MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
00001 PAUL OK OK OK OK - OK - - - - - -
00002 MARK OK OK OK - - - OK - - - - - -
00003 JACK OK - - - - - OK - - - - - -
more 50K lines
我的数据库很简单
USERS
user_id
user_name
DOCUMENTS
document_id
document_user_id
document_date
document_file
首先,我通过这种方式获得aa用户
$query_users = " SELECT user_id, user_name FROM users ";
$res_users = mysqli_query($mysqli,$query_users) or die(mysqli_error($mysqli));
并用一段时间创建一个表
<table style="width:100%">
<tr>
<th>ID</th>
<th>NAME</th>
<th>JAN</th>
<th>FEB</th>
<th>MAR</th>
<th>APR</th>
<th>MAY</th>
<th>JUN</th>
<th>JUL</th>
<th>AUO</th>
<th>SEP</th>
<th>OCT</th>
<th>NOV</th>
<th>DEC</th>
</tr>
<?php
while($row = mysqli_fetch_assoc($res_users)) {
$user_id = $row['user_id'];
$user_name = $row['user_name'];
?>
<tr>
<td><?php echo $user_name; ?></td>
// For each month I run this query to check if user have document on year
<?
// --------------------------------------------------------------------------------------------
// GET JAN DOCS
// --------------------------------------------------------------------------------------------
$query_doc_month_01 = "
SELECT document_id, document_date,
SUM(documento_date) AS total_documents
FROM documents
WHERE document_user_id = '$user_id'
AND document_date = '$year-01-00'
LIMIT 1
";
$res_doc_month_01 = mysqli_query($mysqli,$query_doc_month_01) or die(mysqli_error($mysqli));
while($row_month_01 = mysqli_fetch_assoc($res_doc_month_01)) {
$document_month_01_id = $row_month_01['document_id'];
?>
<td <? if ($document_month_01 == '') { echo 'bgcolor="#f1f1c1"'; } ?>>
<? if ($document_month_id == '') { echo '- - -'; } else { echo $document_month_01_id; } ?>
</td>
<?php
}
?>
<?
// --------------------------------------------------------------------------------------------
// SAME ABOVE TO GET FEB DOCS
// SAME ABOVE TO GET MAR DOCS
// ETC ETC
// --------------------------------------------------------------------------------------------
?>
</tr>
<?php
}
mysqli_close($mysqli);
?>
</table>
解决方案
看起来您可以在第一个查询中使用 JOIN 并一次获取所有数据。这样你就不会在循环中做另一个查询。
Select user_id, user_name, document_id, document_date, document_file from users u INNER JOIN documents on d.document_user_id = u.user_id order by u.user_id
如果您仍然想显示没有文档的用户,请使用左连接而不是内部连接。
只使用一个查询应该会快很多。您为我要的用户设置一个 var,并在它更改时创建一个新行。
我还可以建议您不要在列前加上表名。在我看来这是多余的。除了 document.document_file 之外,只知道 document.file 就足够了。
手机打字,如有错别字见谅。
推荐阅读
- sql - 使用不包含字符串“05613”的正则表达式。表中有 NAW_05613_11_PL04_02。需要不显示具有 05613 的条件行
- image - 在 pyspark 中编写图像数据帧
- python - 如何在 django 中以多行显示输出?'\n' 不起作用
- asp.net-mvc - 从 AZURE SEARCH 索引查询时,我们是否必须在任何地方定义 url
- swift - 在 Swift 中的 URL 处启动 Safari(不是默认浏览器)?
- python - /bin/sh: 1: 诗歌:未找到
- java - 警报管理器 BrodcastReceiver
- angular - ng build --prod index.html 文件没有生成后?
- c# - ASP.NET Core - 存储库依赖注入在单例注入时失败
- javascript - 节点 Js - 没有得到响应