Как включить некоторые данные и другие данные в SQL обусловленных на сегодняшний день? - PullRequest
0 голосов
/ 27 марта 2020

Итак, у меня есть этот запрос, который выбирает пользователей, некоторые данные, некоторые фильтры (например, группу, в которой они находятся, и прочее) и вместе с ними сумму, которую они произвели (в $) в прошлом месяце (получить последнюю существующую запись). с прошлого месяца, используя MAX(created_date)), для платформы управления, которая показывает, сколько они произвели в этом месяце и в предыдущем (us.amount_produced и up.amount_produced last_month_amount).

Проблема в том, что он не выбирает новых пользователей (которые не произвели ни одной суммы в прошлом месяце), и мне нужно, чтобы те тоже возвращались.

Любая помощь приветствуется, спасибо

(я думал о выполнении JOIN или даже двух запросах, но я уверен в лучшем подходе)

Обратите внимание на приведенных ниже примерах, что пользователь # У 3 не было журналов в таблице User_Performance до февраля, он был создан в феврале. Таким образом, приведенный ниже запрос не вернет его (мне нужно его вернуть)

Структура таблицы пользователя:

Users
id       email            login    amount_produced   created_date
---------------------------------------------
1        foo@bar.com      foo      1000              2019-12-20 22:30:01
2        jack@gmail.com   jack     0                 2019-12-20 22:30:01
3        john@gmail.com   john     2000              2020-02-01 00:00:01

Структура таблицы User_Group_Config:

User_Group_Config
user_id       group_id
---------------------------------------------
   1            4  
   2            1
   3            4

User_Performance структура таблицы эта таблица представляет собой таблицу журнала, в которую задание вставляет данные каждый час, вычисляя производительность пользователей и ведя журнал :

Users
user_id       amount_produced     created_date
---------------------------------------------
1                   500           2020-01-31 22:30:01
2                   0             2020-01-31 22:30:01
1                   500           2020-01-31 23:30:01
2                   0             2020-01-31 23:30:01
1                   1000          2020-02-01 00:30:01
2                   0             2020-02-01 00:30:01
3                   0             2020-02-01 00:30:01
SELECT 
    us.id,
    us.email,
    us.login,
    ugc.group_id,
    up.user_id,
    up.amount_produced last_month_amount
FROM
    db.User_Performance AS up,
    db.User_Group_Config ugc,
    db.User AS us
WHERE
    created_date IN (SELECT 
            MAX(created_date)
        FROM
            User_Performance
        WHERE
            /* Here it filters only users that have data last month, I need these AND the ones that have no data to return zero here or null or undefined at this row)*/
            MONTH(created_date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
        GROUP BY user_id)
        AND ugc.group_id = 4
        AND up.user_id = ugc.user_id
        AND us.id = up.user_id;

Желаемые результаты (примечание этот пользователь # 2 не был выбран, так как его group_id # 1

Results 
                                   (current month)   (previous month)
id       email            login    amount_produced   last_month_amount
---------------------------------------------
1        foo@bar.com      foo      1000              500
3        john@gmail.com   john     0                 null or 0

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Решено с помощью этого, с подзапросом и JOIN (не лучшее решение, но решение):

SELECT 
    us.id,
    us.email,
    us.login,
    ugc.group_id,
    us.amount_produced,
    (
        SELECT
            perf.amount_produced
        FROM
            User_Performance perf
        WHERE
            perf.user_id = us.id AND
            perf.created_date BETWEEN DATE_FORMAT(CURRENT_DATE - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00') and CONCAT(LAST_DAY(CURRENT_DATE - INTERVAL 1 MONTH), " 23:59:59")
        ORDER BY
            perf.created_date DESC
            LIMIT 1
    ) as amount_produced_last_month
FROM
    User AS us
INNER JOIN
    User_Group_Config ugc ON ugc.user_id = us.id
WHERE
    ugc.group_id = 4;
0 голосов
/ 27 марта 2020

Тест

SELECT 
    us.id,
    us.contact_phone,
    us.email,
    us.first_name,
    us.last_name,
    us.login,
    ugc.group_id,
    us.create_date,
    us.expire_date,
    us.profile_photo,
    us.dashboard_enabled,
    us.general_rating,
    us.rework_rating,
    us.amount_produced,
    us.amount_spent,
    up.user_id,
    up.amount_produced last_month_amount
FROM db.User_Performance AS up
LEFT JOIN db.User_Group_Config ugc ON up.user_id = ugc.user_id AND ugc.group_id = 4
LEFT JOIN db.User us ON us.id = up.user_id
WHERE
    up.created_date IN (SELECT 
            MAX(created_date)
        FROM
            User_Performance
        WHERE
            /* Here it filters only users that have data last month, I need these AND the ones that have no data to return zero here or null or undefined at this row)*/
            MONTH(created_date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
        GROUP BY user_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...