Страницы

Поиск по вопросам

вторник, 17 декабря 2019 г.

Считаем количество пропущенных ежедневных записей за последнюю неделю.

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

Комментариев нет:

Отправить комментарий