#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
предложении (оставлены отдельно от тех, которые агрегируются).