Самый быстрый способ найти сумму столбца из таблицы2 и показать ее с таблицей1 - PullRequest
0 голосов
/ 27 апреля 2020

У меня две таблицы,

table1
=======================================
pid    pname           coldate      col4
---------------------------------------
1      Tesitng Name1   2019-01-01    self
2      Tesitng Name2   2020-01-01    self
3      Tesitng Name3   2020-03-01    self2
4      Tesitng Name4   2020-04-04    self2
5      Tesitng Name5   2020-04-05    self3

в table1 pid есть уникальный ключ

table2 //which have more than 600k rows
=======================================
billid   rate            pid
---------------------------------------
1        30               1
2        50               1
3        40               1
4        20               2
5        60               2
6        10               3

/// В table2 billid есть уникальный ключ

Я пытаюсь показать все строки таблицы1 с суммой столбца ставки таблицы2, где table1.pid = table2.pid

Результат будет таким:

   table1
    =======================================================
    pid    pname           coldate       col4     total
    -------------------------------------------------------
    1      Tesitng Name1   2019-01-01    self      120
    2      Tesitng Name2   2020-01-01    self       80

Я использую этот запрос, и он работает для меня но это займет много времени, пожалуйста, скажите мне самый быстрый способ

SELECT t1.*,
          (SELECT sum(rate) as total FROM table2 where pid=t1.pid) as total
          FROM table1 t1 WHERE t1.coldate BETWEEN '2020-01-0' AND '2020-04-01'
          AND t1.col4 Like 'self' ORDER BY t1.pid DESC;

Я использую php с mysql ..

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Попробуйте это:

SELECT 
    t1.*
    , ttl.total
FROM table1 t1 
    inner join 
        (SELECT pid, sum(rate) as total 
        FROM table2 
        GROUP BY pid) as ttl
            on ttl.pid=t1.pid
WHERE 
    t1.coldate BETWEEN '2020-01-01' AND '2020-04-01'
    AND t1.col4 = 'self' 
ORDER BY t1.pid DESC;
0 голосов
/ 27 апреля 2020

Вы подходите с использованием коррелированного подзапроса, это довольно хороший и, возможно, самый быстрый метод.

Для производительности вам нужен индекс на table2(pid, rate).

Можно также рассмотреть индекс на table1(col4, coldate, pid) и переписать условие на col4, чтобы использовать явное равенство вместо сопоставления с шаблоном без подстановочного знака (хотя, возможно, база данных уже оптимизировала это):

SELECT 
    t1.*,
    (SELECT sum(rate) as total FROM table2 where pid=t1.pid) as total
FROM table1 t1 
WHERE 
    t1.coldate BETWEEN '2020-01-01' AND '2020-04-01'
    AND t1.col4 = 'self' 
ORDER BY t1.pid DESC;

В крайнем случае, вы можете также перечислить все столбцы из table1 в предложении SELECT и добавить их в индекс, в надежде, что это сделает его , охватывающим - table1(col4, coldate, pid, name):

SELECT 
    t1.pid,
    t1.name,
    t1.coldate,
    t1.col4,
    (SELECT sum(rate) as total FROM table2 where pid=t1.pid) as total
FROM table1 t1 
WHERE 
    t1.coldate BETWEEN '2020-01-01' AND '2020-04-01'
    AND t1.col4 = 'self' 
ORDER BY t1.pid DESC;
...