Данные MySQL Count за последние 7 дней

У меня есть следующая схема.

Таблица голосов

+------------------+--------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------+--------------+------+-----+---------------------+----------------+ | id | int(10) | NO | PRI | NULL | auto_increment | | aid | varchar(10) | NO | | | | | ip | varchar(100) | NO | | | | | host | varchar(200) | NO | | | | | timestamp | varchar(20) | NO | | 0000-00-00 00:00:00 | | | user | tinytext | NO | | NULL | | | userid | int(10) | NO | | 0 | | +------------------+--------------+------+-----+---------------------+----------------+ 

Здесь я хочу получить счет каждой помощи за один день за последние 7 дней с «0» для дат, где нет голосов за помощь. timestamp – unix timestamp здесь.

Любая помощь высоко ценится.

    MySQL не имеет рекурсивной функциональности, поэтому вам остается использовать трюк NUMBERS –

    1. Создайте таблицу, содержащую только инкрементирующие числа – легко сделать с помощью auto_increment:

       DROP TABLE IF EXISTS `example`.`numbers`; CREATE TABLE `example`.`numbers` ( `id` int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
    2. Заполните таблицу, используя:

       INSERT INTO NUMBERS (id) VALUES (NULL) 

      … за столько же значений, сколько вам нужно.

    3. Используйте DATE_ADD для создания списка дат, увеличивая количество дней на основе значения NUMBERS.id. Замените «2010-01-01» и «2010-01-02» на соответствующие даты начала и окончания (но используйте тот же формат, ГГГГ-ММ-ДД ЧЧ: ММ: СС). В этом примере я вычитал значение NUMBERS.id из CURRENT_DATE, чтобы получить список последовательных значений даты за последнюю неделю –

       SELECT x.dt FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt FROM numbers n WHERE n.id <= 7 ) x 
    4. LEFT JOIN на таблицу данных, основанную на части datetime.

        SELECT x.dt, COUNT(v.aid) AS num FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt FROM numbers n WHERE n.id <= 7 ) x LEFT JOIN VOTES v ON DATE(FROM_UNIXTIME(v.timestamp)) = DATE(x.dt) GROUP BY x.dt ORDER BY x.dt 

    Почему номера, а не даты?

    Простые даты могут быть сгенерированы на основе числа, как в приведенном выше примере. Это также означает использование одной таблицы, например, для каждого типа данных.

    Ранее:

      SELECT DATE(FROM_UNIXTIME(v.timestamp)) AS dt, COUNT(v.aid) FROM VOTES v WHERE DATE(FROM_UNIXTIME(v.timestamp)) BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY) AND CURRENT_DATE GROUP BY DATE(FROM_UNIXTIME(v.timestamp)) 

    может попытаться преобразовать ваш varchar (20) в DATETIME, так как это то, что вы используете в любом случае. Но за последние 7 дней просто делайте WHERE timestamp> @ 7DaysAgo. В своем объяснении вы сказали, что используете временную метку unix, поэтому вам нужно будет отправить временную метку с этого момента – 7 дней. Вы также захотите изменить значение по умолчанию на 0, так как вы указали ваши отметки времени, а не значения DATETIME.

    SELECT COUNT (*) в качестве голосов, помощь FROM table WHERE timestamp> @ 7DaysAgo GROUP BY help