【问题标题】:Is there a better way to write an AVG() SQL query for multiple tables (or a way to improve my code)有没有更好的方法来为多个表编写 AVG() SQL 查询(或改进我的代码的方法)
【发布时间】:2023-03-16 06:05:01
【问题描述】:

我对管理包含大量数据的 sql 查询有点陌生,并且我试图提高请求的性能。 我的问题是我有多个名称不同但结构相同的表,所以我必须从所有表中平均 temp 的值以供以后使用。

我目前正在使用此代码:

//these value changes on each request, here are some examples to help you understand
$ano_desde = 2019; 
$mes_hasta = 4;
$id_t = 1123;
//

for ($ano = $ano_desde; $ano <= $ano_hasta; $ano++) {
            for ($mes = $mes_hasta; $mes <= 12; $mes++) {


                $sql = " SELECT AVG(temp) FROM table".$ano."_".$mes." WHERE id_t = $id_t";

                //HERE I WOULD SEND THE QUERY TO MY DB AND SAVE RESP ON $TEMP

                $temp = queryResp;

                if ($temp != 0) {
                    $temps[] = floatval($temps);
                }
            }
        }

这确实有效,但我的响应时间为 4 到 5 秒,我很乐意改进它,无论是在 php 代码中还是在我的查询中。

在此先感谢,对于任何拼写错误,我深表歉意,因为英语不是我的母语。

【问题讨论】:

  • 您应该学习的第一件事是将数据全部存储在一个表中,而不是按年份拆分表。
  • 不幸的是,我无法控制 db 架构,它是这样制作的
  • 你的表有相关的索引吗?
  • 不是,不是。唯一相关的索引是 id_t

标签: php mysql sql loops average


【解决方案1】:

我认为您正在寻找的是看起来像 它会加入所有的表,然后做一个平均。 (如果你对每张桌子都这样做,你会得到平均值的平均值。

SELECT AVG(temp) from (
SELECT temp FROM table.ano._mes1 WHERE id_t = id_t
UNION ALL
SELECT temp FROM table.ano._mes1 WHERE id_t = id_t
UNION ALL
SELECT temp FROM table.ano._mes1 WHERE id_t = id_t
) a

其实你调用也这样做以获得更好的性能

SELECT s/c avgtmp from (
SELECT sum(temp) s, count(temp) c FROM table.ano._mes1 WHERE id_t = id_t
UNION ALL
SELECT sum(temp) s, count(temp) c FROM table.ano._mes1 WHERE id_t = id_t
UNION ALL
SELECT sum(temp) s, count(temp) c FROM table.ano._mes1 WHERE id_t = id_t
) a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多