количество вхождений в 2 таблицы

#php #mysql #datetime #count #aggregate-functions

#php #mysql #дата и время #количество #агрегатные функции

Вопрос:

У меня есть таблица с именем tasks (id, date, id_user). У меня есть другая таблица с именем calendar (id, дата). чтобы найти количество вхождений поля даты для пользователя между 2 датами, я использую запрос :

 $test1 = date(Y-m-d', strtotime('-7'));
$test2 = date('Y-m-d');
$query= $connect->prepare("SELECT *, COUNT(*) AS counter FROM tasks WHERE matricule ='".$_SESSION['matricule']."' AND date < '".$test2."' AND date >= '".$test1."' GROUP BY date");
 

Этот запрос работает.
Я также хочу отображать 0 для дат, которых нет в моих табличных задачах, но есть в табличном календаре

Ответ №1:

Вы хотите подсчитать ежедневные задачи, выполняемые данным пользователем в течение нескольких дней, включая дни без задач.

Если у вас есть таблица календаря — скажем calendar(dt) , где dt a date — вы можете сделать:

 select c.dt, count(t.date) as counter
from calendar c
left join tasks t 
    on  t.matricule = :matricule
    and t.date = c.dt
where c.date >= :start_date and c.date < :end_date
group by c.dt
 

:matricule :start_date и :end_date являются параметрами запроса; вы действительно должны использовать подготовленные операторы вместо объединения опубликованных значений в строке запроса, что открывает ваш код для SQL-инъекции.

Если временной диапазон всегда равен последней неделе:

 where c.date >= current_date - interval 7 day and c.date < current_date
 

Обратите внимание, чем агрегация отличается от вашего исходного кода: столбцы в select предложении повторяются в group by предложении (оставлены отдельно от тех, которые агрегируются).