有没有更好的方法为多个表编写avg()sql查询(或者改进代码的方法)

ep6jt1vc  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(438)

我对管理具有大量数据的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代码或在我的查询。
提前谢谢,我为任何拼写错误道歉,因为英语不是我的第一语言。

72qzrwbm

72qzrwbm1#

我认为您需要的是sql,它看起来像是将所有表连接起来,然后执行avg(如果对每个表执行此操作,您将得到平均值的平均值)。

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

相关问题