Передача аргумента в левое соединение - PullRequest
0 голосов
/ 28 мая 2019

В настоящее время я пытаюсь получить данные из 2 таблиц с LEFT JOIN, имеющим неизвестное значение.

Я пытался использовать LEFT JOIN, но это не сработало.

Вот мой пример кода:

SELECT 
    cc.shid,
    cc.user,
    ts.type,
    sum(cc.qty1) + sum(cc.qty2) as qty_tot,
    COUNT(cc.id) as nb
FROM
    content_c cc
LEFT JOIN
    (SELECT
        s.shid,
        s.type
    FROM
        tab_s s
    LIMIT 1
    ) as ts ON ts.shid = cc.shid
WHERE 
    cc.time_i like '2019-01%'
GROUP BY 
    cc.user,
    ts.type

С этим запросом он никогда не будет работать: ts будет содержать первое вхождение tab_s независимо от cc.shid. Интересно, есть ли способ сделать это:

LEFT JOIN
    (SELECT
        s.shid,
        s.type
    FROM
        tab_s s
    WHERE
        s.shid = cc.shid
    LIMIT 1
    ) as ts ON ts.shid = cc.shid

Есть идеи? Есть ли в SQL понятие указателя или что-то в этом роде? Как я могу использовать & cc.shid, или @ cc.shid?

Обратите внимание, что выполняется следующее:

LEFT JOIN tab_s ts ON ts.shid = cc.shid

Мой запрос займет более 1 минуты для отображения результатов. И я не могу установить индекс в tab_s.shid так же хорошо, как cc.shid, так как он встречается несколько раз.

Пожалуйста, имейте в виду, что для content_c может быть несколько раз cc.shid, поэтому мне нужно получить только первый результат (LIMIT 1). Это важно.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Использовать коррелированный подзапрос:

SELECT cc.shid, cc.user, cc.type,
       SUM(cc.qty1) + SUM(cc.qty2) as qty_tot,
       COUNT(cc.id) as nb
FROM (SELECT cc.*,
             (SELECT s.type
              FROM tab_s s
              WHERE ts.shid = cc.shid
              LIMIT 1 
             ) as type
      FROM content_c cc
     ) cc
WHERE cc.time_i >= '2019-01-01' AND
      cc.time_i < '2019-02-01'
GROUP BY cc.shid, cc.user, cc.type;

Примечания:

  • Использование LIMIT без ORDER BY является подозрительным. Почему в основной таблице должны быть дубликаты?
  • Ваши сравнения дат плохие. Используйте функции даты / времени при работе со значениями даты / времени. Не используйте строковые функции.
  • GROUP BY должен включать все неагрегированные столбцы в SELECT.
0 голосов
/ 28 мая 2019

Как уже говорилось в комментариях к вопросу, не могли бы вы попробовать этот скрипт и посмотреть, соответствует ли он вашим требованиям? Это вернет строку для каждого идентификатора в таблице «content_c» с воздействием GROUP BY.

SELECT 
    cc.shid,
    cc.user,
    ts.type,
    sum(cc.qty1) + sum(cc.qty2) as qty_tot,
    COUNT(cc.id) as nb
FROM content_c cc
LEFT JOIN
(
    SELECT DISTINCT s.shid, s.type FROM tab_s s
) AS ts ON ts.shid = cc.shid
WHERE cc.time_i like '2019-01%'
GROUP BY cc.shid,cc.user,ts.type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...