Есть ли лучший способ написать запрос AVG () SQL для нескольких таблиц (или способ улучшить мой код) - PullRequest
0 голосов
/ 28 мая 2020

Я новичок в управлении 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 или мой запрос.

Заранее спасибо, прошу прощения за любые орфографические ошибки, так как английский sh не мой родной язык.

1 Ответ

0 голосов
/ 28 мая 2020

Я думаю, что вы ищете sql, которые выглядят примерно так: Он объединит все таблицы, а затем выполнит среднее. (если вы сделаете это для каждой таблицы, вы получите среднее арифметическое.

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
...