Показать количество всех дат в соответствии с другой таблицей в sql? - PullRequest
0 голосов
/ 17 января 2019

У меня есть две таблицы, одна из которых является календарной, а вторая - final_registration следующим образом:

Таблица моего календаря:

*--------------------*
| S.No. |  datefield |
*--------------------*
|  1    | 2019-01-01 |
|  2    | 2019-01-02 |
|  3    | 2019-01-03 |
|  4    | 2019-01-04 |
|  5    | 2019-01-05 |
|  6    | 2019-01-06 |
|  7    | 2019-01-07 |
|  8    | 2019-01-08 |
|  9    | 2019-01-09 |
|  10   | 2019-01-10 |
|  11   | 2019-01-11 |
|  12   | 2019-01-12 |
|  13   | 2019-01-13 |
|  14   | 2019-01-14 |
|  15   | 2019-01-15 |
|  16   | 2019-01-16 |
|  17   | 2019-01-17 |
|  18   | 2019-01-18 |
|  19   | 2019-01-19 |
|  20   | 2019-01-20 |
|  21   | 2019-01-21 |
|  22   | 2019-01-22 |
|  23   | 2019-01-23 |
|  24   | 2019-01-24 |
|  25   | 2019-01-25 |
|  26   | 2019-01-26 |
|  27   | 2019-01-27 |
|  28   | 2019-01-28 |
|  29   | 2019-01-29 |
|  30   | 2019-01-30 |
|  31   | 2019-01-31 |
---------------------

Мой второй стол:

*-----------------------------------------*
| id | event_id |  name |    booking_date  |
*-----------------------------------------*
| 1  |   101    |  Ritu | 2019-01-15 13:21 |
| 2  |   101    | Seeta | 2019-01-15 18:21 |
| 3  |   101    | Geeta | 2019-01-16 13:21 |
| 4  |   102    | Wasim | 2019-01-16 14:21 |
| 5  |   102    | Rahul | 2019-01-17 13:21 |
| 6  |   101    | Gagan | 2019-01-17 14:21 |
| 7  |   101    | Sunny | 2019-01-17 15:21 |
| 8  |   101    | Aman  | 2019-01-17 16:21 |
-------------------------------------------

Я пытаюсь ниже вывода:

*--------------------*
|  datefield | count |
*--------------------*
| 2019-01-01 |  0   |
| 2019-01-02 |  0   |
| 2019-01-03 |  0   |
| 2019-01-04 |  0   |
| 2019-01-05 |  0   |
| 2019-01-06 |  0   |
| 2019-01-07 |  0   |
| 2019-01-08 |  0   |
| 2019-01-09 |  0   |
| 2019-01-10 |  0   |
| 2019-01-11 |  0   |
| 2019-01-12 |  0   |
| 2019-01-13 |  0   |
| 2019-01-14 |  0   |
| 2019-01-15 |  2   |
| 2019-01-16 |  1   |
| 2019-01-17 |  3   |
---------------------

Так как сегодня, 17 января, мне нужен вывод до текущей даты. Я пробовал запрос, но он не был дан мне с 01 января по 14 января

SELECT calendar.datefield, COUNT(calendar.datefield)
FROM calendar
LEFT JOIN final_registration
    ON DATE_FORMAT(calendar.datefield, '%Y-%m-%d') = DATE_FORMAT(final_registration.booking_date, '%Y-%m-%d')
WHERE DATE_FORMAT(calendar.datefield, '%Y-%m-%d') <= DATE_FORMAT( CURDATE(), '%Y-%m-%d' )
  AND DATE_FORMAT(calendar.datefield, '%Y-%m') = DATE_FORMAT( CURDATE(), '%Y-%m' )
  AND final_registration.event_id = '101'
GROUP BY DATE_FORMAT(calendar.datefield, '%Y-%m-%d')

Мой запрос дал мне следующий результат:

*--------------------*
|  datefield | count |
*--------------------*
| 2019-01-15 |   2   |
| 2019-01-16 |   1   |
| 2019-01-17 |   3   |
*--------------------*

Я много пробовал, но не смог добиться результата.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Необходимо перенести некоторые ограничения в предложении WHERE в предложение ON:

SELECT
    c.datefield,
    COUNT(f.booking_date) AS cnt
FROM calendar c
LEFT JOIN final_registration f
    ON c.datefield = DATE(f.booking_date) AND
       f.event_id = '101'
WHERE
    c.datefield BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01') AND CURDATE()
GROUP BY
    c.datefield;

enter image description here

Демо

Обратите внимание, что вы хотите сосчитать поле из таблицы final_registration, которая появляется справа от левого соединения.

Задержка в моем ответе произошла из-за очистки вашего запроса, чтобы удалить все ненужные вызовы на DATE_FORMAT. Вы должны иметь возможность иметь дело непосредственно с datefield. Что касается предложения WHERE, похоже, вам просто нужны даты, которые находятся в текущем месяце, но не позднее текущего дня месяца.

0 голосов
/ 17 января 2019

Вы делаете ваше LEFT объединение в INNER объединение путем включения критериев в предложение WHERE. Попробуйте это:

SELECT calendar.datefield, COUNT(calendar.datefield)
FROM calendar
LEFT JOIN final_registration
    ON DATE_FORMAT(calendar.datefield, '%Y-%m-%d') = DATE_FORMAT
(final_registration.booking_date, '%Y-%m-%d')
  AND final_registration.event_id = '101'
WHERE DATE_FORMAT(calendar.datefield, '%Y-%m-%d') <= DATE_FORMAT( CURDATE(), '%Y-%m-%d' )
  AND DATE_FORMAT(calendar.datefield, '%Y-%m') = DATE_FORMAT( CURDATE(), '%Y-%m' )
GROUP BY DATE_FORMAT(calendar.datefield, '%Y-%m-%d')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...