Mysql совместный подзапрос, как показать результат только в том же месяце и году и null - PullRequest
0 голосов
/ 10 июля 2020

у меня есть две таблицы

input_table

+--------+-----------+------------+
|     id | id_user   | input_date |        
+--------+-----------+------------+
|      1 |         A | 2020-09-18 | 
|      2 |         B | 2020-09-18 |
|      3 |         C | 2020-09-18 | 
|      4 |         D | 2020-09-18 | 
|      5 |         E | 2020-09-18 | 
|      6 |         A | 2001-09-02 |
+--------+-----------+------------+

pay_table

+--------+-----------+------------+
|     id | id_user   | paid_date  |
+--------+-----------+------------+
|      1 |         A | 2020-09-19 |
|      2 |         B | 2020-09-20 |
|      3 |         C | 2020-09-21 |
|      4 |         A | 2001-09-19 |
+--------+-----------+------------+

Я хочу, чтобы результат отображал только тот же месяц и год input_date и Paid_date где месяц 09 и год 2020, и результат должен выглядеть как эта таблица

таблица результатов

+--------+-----------+------------+--------------+
|     id | id_user   | input_date | paid_date    |
+--------+-----------+------------+--------------+
|      1 |         A | 2020-09-18 | 2020-09-19   |
|      2 |         B | 2020-09-18 | 2020-09-20   |
|      3 |         C | 2020-09-18 | 2020-09-21   |
|      4 |         D | 2020-09-18 |   null       |
|      5 |         E | 2020-09-18 |   null       |
+--------+-----------+------------+--------------+

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

SELECT u.id, u. id_user, u. input_date ,bd. paid_date, bd. id_user

FROM tabel_tunggakan u 

LEFT JOIN paid_table bd 

ON u. id_user = bd. id_user 

WHERE u. id_user
IN (select id_user from paid_table where MONTH (paid_date) ='09’  AND YEAR( paid_date  )='2020')

может ли кто-нибудь указать мне путь

1 Ответ

2 голосов
/ 10 июля 2020

Если каждая строка в paid_table имеет хотя бы одну соответствующую строку в input_table (тот же пользователь в том же году / месяце), то

SELECT id_user, t1.input_date, t2.paid_date
FROM ( SELECT id_user, MAX(input_date) input_date
       FROM input_table
       WHERE MONTH(input_date) = 9 AND YEAR(input_date) = 2020
       GROUP BY input_date) t1
LEFT JOIN ( SELECT id_user, MAX(paid_date) paid_date
            FROM paid_table
            WHERE MONTH(paid_date) = 9 AND YEAR(paid_date) = 2020
            GROUP BY paid_date ) t2 USING (id_user)

Если нет, то

SELECT t0.id_user, t1.input_date, t2.paid_date
FROM ( SELECT id_user
       FROM input_table
       WHERE MONTH(input_date) = 9 AND YEAR(input_date) = 2020
     UNION
       SELECT id_user
       FROM paid_table
       WHERE MONTH(paid_date) = 9 AND YEAR(paid_date) = 2020 ) t0
LEFT JOIN ( SELECT id_user, MAX(input_date) input_date
            FROM input_table
            WHERE MONTH(input_date) = 9 AND YEAR(input_date) = 2020
            GROUP BY input_date) t1 ON t0.id_user = t1.id_user
LEFT JOIN ( SELECT id_user, MAX(paid_date) paid_date
            FROM paid_table
            WHERE MONTH(paid_date) = 9 AND YEAR(paid_date) = 2020
            GROUP BY paid_date ) t2 ON t0.id_user = t1.id_user

Если существует более одной строки для пользователя в месяце, то в обоих запросах выбирается последняя дата.

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