首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL查询优化以获取月度报表

MySQL查询优化以获取月度报表
EN

Stack Overflow用户
提问于 2018-06-15 06:28:18
回答 3查看 41关注 0票数 0

我需要优化一个查询。脚本返回一个简单的表格结果,如下所示。

我喜欢加速结果,也许一种解决方案是将每个月的查询合并为一个查询。

什么是以最快的速度获得列表的最好和正确的方法?

表格

代码语言:javascript
复制
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

我的数据库很简单

代码语言:javascript
复制
 USERS
  user_id
  user_name

 DOCUMENTS
  document_id
  document_user_id
  document_date
  document_file

首先,我以这种方式获得a用户。

代码语言:javascript
复制
$query_users = " SELECT user_id, user_name FROM users ";
$res_users = mysqli_query($mysqli,$query_users) or die(mysqli_error($mysqli));

并用一段时间创建一个表

代码语言:javascript
复制
<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>
EN

回答 3

Stack Overflow用户

发布于 2018-06-15 06:38:39

看起来您可以在第一个查询中使用连接,并一次性获取所有数据。这样,您就不会在循环中执行另一个查询。

代码语言:javascript
复制
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

如果您仍然希望显示没有文档的用户,请使用left JOIN而不是inner。

通过只使用一个查询,它应该会快得多。您可以为用户I'd设置一个var,并在它发生变化时创建一个新行。

我还建议您不要在列前加上表名。在我看来,这是多余的。除了document.document_file之外,只需要知道document.file就足够了。

在手机上打字,如果有任何打字错误,我很抱歉。

票数 1
EN

Stack Overflow用户

发布于 2018-06-15 06:39:53

当前您正在执行以下操作: query with N results每N个结果执行另一个查询,乘以12。

这意味着数据库中充斥着大量的查询请求。使用内部联接。这不是完整的查询,但它将帮助您开始:

代码语言:javascript
复制
 SELECT u.user_id, u.user_name 
 FROM users U INNER JOIN documents D 
 ON D.document_user_id = u.user_ID

如果需要,可以使用其中一个或最多12个查询来执行此操作。

避免发出过多的请求。

票数 0
EN

Stack Overflow用户

发布于 2018-06-15 07:05:29

试试这个:

代码语言:javascript
复制
SELECT user_id, user_name, YEAR(document_date) as year, MONTH(document_date) as month, COUNT(*)
FROM users
LEFT JOIN documents ON (document_user_id = user_id)
GROUP BY user_id, year, month

这应该为每个用户返回一行,这些用户在一年中的某个特定月份拥有文档,如果没有找到文档,则不会返回任何内容,您可以检查并显示未返回行的空数据

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50866795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档