#дата #php
Здравствуйте! Есть интересная задачка. Есть установленная дата, например 2014-07-02. Есть таблица в БД posts, куда пользователь каждый день добавляет по одной записи, и получается примерно такая табличка: +----+----------------------------------+------------+ | id | title | date | | 1 | Очень хороший день | 2014-07-10 | | 2 | Неплохой день | 2014-07-09 | | 3 | Хороший день | 2014-07-08 | | 4 | Могло быть и лучше | 2014-07-07 | | 5 | Не доделал что хотел | 2014-07-06 | | 6 | Забыл вчера написать | 2014-07-05 | | 7 | Начал следить за собой | 2014-07-03 | | 8 | Стартуем | 2014-07-02 | +----+----------------------------------+------------+ Мне нужно вывести статистику за последнюю неделю, относительно той даты, и вывести её юзеру, главный показатель: var final = Пропущено записей на этой неделе - 0. Для решения этой задачи, мне нужно получить последние 7 записей, и сравнить их с датами последних 7 дней. Задача для юзера, не допустить чтобы var final был больше 1. Для меня задача, если больше 1 это значение, вывести сообщение соответствующее. Я написал функцию на php, которая получает массив последних 7 дней, но дальше не знаю как связать всё воедино: if ( ! function_exists('get_array_seven_day')) { function get_array_seven_day() { $array = array(); for($i=1;$i<8;$i++) { $array[] = date('d.m',strtotime(date('d.m.Y H:i:s'))-60*60*24*$i); } return $array; } }
Ответы
Ответ 1
Во-первых в таблице не хватает индификатора юзера. Еще нужен уникальный ключ на дату + юзера. Таблица выглядит так: CREATE TABLE `posts` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL DEFAULT '', `date` date NOT NULL, `user_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `u_date_user_id` (`date`,`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Во-вторых получаем одним запросом оба значения – кол-во указанных и кол-во не указаных дней SELECT COUNT(DISTINCT `date`) AS set_counts, 7 - COUNT(DISTINCT `date`) AS unset_counts FROM `posts` WHERE `date` BETWEEN CURDATE() - INTERVAL 6 DAY AND CURDATE() AND user_id = 1; В этом запросе мы выбираем последние 7 дней от текущего. Если нужно получить прошлую календарную неделю, то сначала на php высчитываем дату последнего воскресения и указываем ее в запросе вместо CURDATE(). DISTINCT добавлен на случай, если в таблице нет индекса на уникальность даты.
Комментариев нет:
Отправить комментарий