#дата #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 добавлен на случай, если в таблице нет индекса на уникальность даты.
Комментариев нет:
Отправить комментарий