Как вывести количество записей за день, неделю, месяц, год. Начиная с этого д/н/м/г
Есть таблица:
| id | name | date(y-m-d) |
|---|---|---|
| 1 | nam1 | 2022-03-13 |
| 2 | nam2 | 2022-03-14 |
| 3 | nam3 | 2022-03-15 |
| 4 | nam4 | 2022-04-02 |
| 5 | nam5 | 2022-05-14 |
| 6 | nam6 | 2022-05-14 |
| 7 | nam7 | 2022-05-18 |
| 8 | nam8 | 2022-06-20 |
| 9 | nam9 | 2022-06-01 |
| 10 | nam10 | 2022-06-29 |
| 11 | nam11 | 2022-06-17 |
Таблица простая. Даже с дополнительными данными она будет простой. Я могу выводить например значения по месяцам вот так: PDO
$sth = $this->db->prepare("SELECT month(names.date) as date, count(id) as c_name FROM names GROUP BY month(names.date) LIMIT 30");
По неделям:
$sth = $this->db->prepare("SELECT week(names.date) as date, count(id) as c_name FROM names GROUP BY week(names.date) LIMIT 30");
Все у меня получается. Но у меня 2 проблемы:
- даты месяца не выводиться полной а только число месяца. (Выводиться 6, а нужно 2022-06 что бы знать год)
- мне нужно вывести целых 30 результатов. Где нет записей по дате оставлять 0.
Выводиться сейчас вот так (по месяцам):
"date":"3","c_name":"3"
"date":"4","c_name":"1"
"date":"5","c_name":"3"
"date":"6","c_name":"4"
Нужно (так-же по месяцам 30 раз начиная с этого месяца/года/недели/дня)
30
..
"date":"2020-6","c_name":"0"
"date":"2020-7","c_name":"0"
"date":"2020-8","c_name":"0"
"date":"2020-9","c_name":"0"
"date":"2020-10","c_name":"0"
"date":"2020-11","c_name":"0"
"date":"2020-12","c_name":"0"
"date":"2021-1","c_name":"0"
"date":"2021-2","c_name":"0"
"date":"2021-3","c_name":"0"
"date":"2021-4","c_name":"0"
"date":"2021-5","c_name":"0"
"date":"2021-6","c_name":"0"
"date":"2021-7","c_name":"0"
"date":"2021-8","c_name":"0"
"date":"2021-9","c_name":"0"
"date":"2021-10","c_name":"0"
"date":"2021-11","c_name":"0"
"date":"2021-12","c_name":"0"
"date":"2022-1","c_name":"0"
"date":"2022-2","c_name":"0"
"date":"2022-3","c_name":"3"
"date":"2022-4","c_name":"1"
"date":"2022-5","c_name":"3"
"date":"2022-6","c_name":"4" -> начиная с текущего месяца
Да, возможно задача сложная. Я ни как не могу построить такой график. Тем более что я не могу вывести и год с месяцем вместе. Прошу пожалуйста, помогите с этой задачей, вывести такой график, желательно только по месяцам, а дальше со днями, годами, неделями я сам.
Ответы (1 шт):
По ощущениям, у вас запросы должны отрабатывать неправильно, т.к. вы сами говорите, что у вас в результате только одно число, т.е. группировка по месяцу, допустим 6 будет за все года, которые имеются в таблице, хотя, возможно это то поведение, которое вы хотите получить.
У вас два готовых запроса, однако, вы зачем-то еще используете такую конструкцию: month(names.date) и в select и в group by.
Не знаю, что у вас за СУРБД, в таком случае, проверьте сначала это:
SELECT
-- изменяем формат даты к: `2022-06`
DATE_FORMAT(names.date, '%Y-%m') as year_and_month,
count(id) as c_name
FROM names
GROUP BY year_and_month
LIMIT 30
Если отработает, будете иметь в результате дату сразу с годом + месяцем (если вдруг Postgres, то почитайте о date_trunc('month', names.date), должно отработать).
По неделям немного интересней, придется заюзать конкатенацию:
SELECT
-- изменяем формат даты к: `2022-06`, но заместо месяца уже будет номер недели
CONCAT(YEAR(names.date), '-', WEEK(names.date)) as year_and_week,
count(id) as c_name
FROM names
GROUP BY year_and_week
LIMIT 30