Очень трудно генерировать имена столбцов в виде строк следующих дат (например, «2018-11-01», «2018-11-02») без жесткого кодирования.
Но я мог бы прийти с ответом, какие имена столбцов названы d1..d7
. Надеюсь, это хорошо в вашем случае. Возможно, это не оптимальное решение, но оно работает.
SELECT
tt.user_id,
SUM(tt.d1) AS d1,
SUM(tt.d2) AS d2,
SUM(tt.d3) AS d3,
SUM(tt.d4) AS d4,
SUM(tt.d5) AS d5,
SUM(tt.d6) AS d6,
SUM(tt.d7) AS d7
FROM
(SELECT
t.user_id,
(CASE WHEN t.`date` = DATE(DATE_ADD(NOW(), INTERVAL 1 DAY)) THEN t.total ELSE 0
END) AS d1,
(CASE WHEN t.`date` = DATE(DATE_ADD(NOW(), INTERVAL 2 DAY)) THEN t.total ELSE 0
END) AS d2,
(CASE WHEN t.`date` = DATE(DATE_ADD(NOW(), INTERVAL 3 DAY)) THEN t.total ELSE 0
END) AS d3,
(CASE WHEN t.`date` = DATE(DATE_ADD(NOW(), INTERVAL 4 DAY)) THEN t.total ELSE 0
END) AS d4,
(CASE WHEN t.`date` = DATE(DATE_ADD(NOW(), INTERVAL 5 DAY)) THEN t.total ELSE 0
END) AS d5,
(CASE WHEN t.`date` = DATE(DATE_ADD(NOW(), INTERVAL 6 DAY)) THEN t.total ELSE 0
END) AS d6,
(CASE WHEN t.`date` = DATE(DATE_ADD(NOW(), INTERVAL 7 DAY)) THEN t.total ELSE 0
END) AS d7
FROM
(
SELECT b.user_id, b.`date`, COUNT(*) as total
FROM `bookings` b
WHERE b.`date` BETWEEN NOW() AND DATE_ADD( NOW(), INTERVAL 7 DAY )
GROUP BY b.user_id, b.`date`) t
) tt
GROUP BY tt.user_id
Этот запрос дает мне такой результат для таблицы, как вы дали.
| user_id | d1 | d2 | d3 | d4 | d5 | d6 | d7 |
----------------------------------------------
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
Здесь d1
означает следующий день. d2
означает послезавтра и т. Д.
Также это решение также дает столбец со всеми нулями (то есть дни без каких-либо событий)