Исправить ПРИСОЕДИНЕНИЕ в запросе - PullRequest
0 голосов
/ 03 июня 2019

В низком запросе, как отобразить все записи в таблице «пользователи»?В настоящее время отображаются только те, кто имеет рекорд продаж

    SELECT
    d.operator_id as num_carteira,
    u.name_carteira as Carteira,
    sum(d.`value`) AS Valor,
    sum(d.`quantity`) AS Qtde
    FROM daily_productivity d
    RIGHT JOIN product p
    ON d.product_id = p.id
    RIGHT JOIN `user` u
    ON d.operator_id = u.id
    WHERE YEAR(date) = 2019 AND MONTH(date) = 06 AND d.daily_productivity_status_id = 2 AND p.mobilizador_id = 1 AND u.role_id = 6 
    ORDER BY u.name_carteira

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Вы не должны использовать столбцы левой / правой соединенных таблиц в предложении where, вы должны добавить эти условия в соответствующее предложение ON

    SELECT
    d.operator_id as num_carteira,
    u.name_carteira as Carteira,
    sum(d.`value`) AS Valor,
    sum(d.`quantity`) AS Qtde
    FROM daily_productivity d
    LEFT  JOIN product p  ON d.product_id = p.id AND  p.mobilizador_id = 1 
    LEFT JOIN `user` u   ON d.operator_id = u.id AND  u.role_id = 6 
    WHERE YEAR(date) = 2019 AND MONTH(date) = 06 AND d.daily_productivity_status_id = 2 
    ORDER BY u.name_carteira

, а также использовать правильную группу по

    SELECT
    d.operator_id as num_carteira,
    u.name_carteira as Carteira,
    sum(d.`value`) AS Valor,
    sum(d.`quantity`) AS Qtde
    FROM daily_productivity d
    LEFT  JOIN product p  ON d.product_id = p.id AND  p.mobilizador_id = 1 
    LEFT JOIN `user` u   ON d.operator_id = u.id AND  u.role_id = 6 
    WHERE YEAR(date) = 2019 AND MONTH(date) = 06 AND d.daily_productivity_status_id = 2 
    GROUP BY d.operator_id as num_carteira,  u.name_carteira as Carteira,
    ORDER BY u.name_carteira

использование функции агрегации без группировки в большинстве дБ (и для конкретной версии дБ) недопустимо и может вызвать ошибку

1 голос
/ 03 июня 2019

Используйте left join s и поместите таблицу туда, где вы хотите сохранить все строки первыми - это будет user.Условия в этой таблице могут быть отфильтрованы в предложении where.

Условия для всех других таблиц должны быть указаны в предложении on:

SELECT d.operator_id as num_carteira, u.name_carteira as Carteira,
       sum(d.`value`) AS Valor, sum(d.`quantity`) AS Qtde
FROM user u LEFT JOIN
     daily_productivity d
     ON d.operator_id = u.id AND
        d.date >= '2019-06-01' AND
        d.date < '2019-07-01' AND
        d.daily_productivity_status_id = 2 LEFT JOIN
     product p
     ON d.product_id = p.id AND p.mobilizador_id = 1
WHERE u.role_id = 6 
GROUP BY d.operator_id, u.name_carteira 
ORDER BY u.name_carteira;

Это предполагает, что date приходитиз таблицы daily_productivity.

Обратите внимание, что я изменил логику даты, чтобы она была более совместимой с индексами.Я бы также рекомендовал использовать u.id вместо d.operator_id в SELECT, поскольку последний может быть NULL.

Если вы действительно хотите, чтобы все пользователи в user, удалили where пункт.

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