Как вывести количество записей за день, неделю, месяц, год. Начиная с этого д/н/м/г

Есть таблица:

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 проблемы:

  1. даты месяца не выводиться полной а только число месяца. (Выводиться 6, а нужно 2022-06 что бы знать год)
  2. мне нужно вывести целых 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 шт):

Автор решения: Borislav

По ощущениям, у вас запросы должны отрабатывать неправильно, т.к. вы сами говорите, что у вас в результате только одно число, т.е. группировка по месяцу, допустим 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
→ Ссылка