Запрос не показывает строку table1, идентификатор которой отсутствует в table2, используя внутреннее соединение - 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        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       0

Я использую этот запрос

    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;

но он не показывает строку таблицы1, для которой pid отсутствует в таблице2, скажите, пожалуйста, какой самый быстрый способ выполнить это действие я использую php с mysql ..

Ответы [ 2 ]

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

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

Чтобы получить все строки из таблицы1, вам нужно СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ вместо ВНУТРЕННЕГО СОЕДИНЕНИЯ

Но ваше предложение Where все равно уменьшает все до 1 строки.

    SELECT 
    t1.*
    , ttl.total
FROM table1 t1 
    LEFT 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

Ваш заголовок говорит сам за себя, как будто вы знаете, что вам нужно LEFT JOIN:

SELECT t1.*, ttl.total
FROM table1 t1 LEFT JOIN
     (SELECT pid, sum(rate) as total
      FROM table2 
      GROUP BY pid
     ) 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;

Для производительности вам, вероятно, следует использовать коррелированный подзапрос:

SELECT t1.*,
       (SELECT SUM(tt1.rate)
        FROM table2 tt1
        WHERE ttl.pid = t1.pid
       ) 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(col4, coldate, pid) и table2(pid, rate).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...