2010-07-30 5 views
1

Я пытаюсь вывести список разных itmes, сгруппированных по дате, в которой они были сохранены в базе данных (unix timestamp).MySQL + PHP (группировка по дате)

Мне нужна помощь как с MySQL (query), так и с PHP (output).

MySQL таблица

идентификатор | предмет | время
1 | test1 | 1280278800
2 | test2 | 1280278800
3 | test3 | 1280365200
4 | test4 | 1280451600
5 | test5 | 1280451600

ВЫВОД

Сегодня
test5
test4

Вчера
test3

28 июля
test2
test1

Буду признателен за любую помощь по этому вопросу. Спасибо! ;-)

+0

Общий совет, чтобы не хранить даты в UNIX проставлены в MySQL, нет никаких причин, чтобы сделать это – Znarkus

ответ

4

Вы можете конвертировать свою временную метку unix в дату, используя DATE(FROM_UNIXTIME(time)). Это выведет что-то вроде 2010-07-30.

Ниже следует указать дату.

SELECT id, subject, time, DATE(FROM_UNIXTIME(time)) AS date_column 
GROUP BY date_column 

Edit: Не читал ваш вопрос правильно.

Для этого я бы просто запустил стандарт SELECT и ORDER BY time DESC.

Затем выполните группировку с помощью PHP.

$lastDate = null; 

foreach ($rows as $row) { 
    $date = date('Y-m-d', $row['time']); 
    $time = date('H:i', $row['time']); 

    if (is_null($lastDate) || $lastDate !== $date) { 
     echo "<h2>{$date}</h2>"; 
    } 

    echo "{$time}<br />"; 

    $lastDate = $date; 
} 
+0

Любая идея, как применять пейджинг (LIMIT) для такого запроса? – ngakak

0

Самый простой способ, вероятно, отсортировать по метке (по убыванию) в SQL и выполнить группировку в PHP: Итерировать по набору результатов, преобразовать метку времени в объект DateTime; когда текущая дата находится в другой день, чем предыдущий (подсказка: используйте DateTime :: format()), вставьте подзаголовок.

2

вы можете создать MySQL UDF для того, что-то вроде этого:

DELIMITER $$ 

DROP FUNCTION IF EXISTS `niceDate` $$ 
CREATE FUNCTION `niceDate` (ts INT) RETURNS VARCHAR(255) NO SQL 
BEGIN 

    declare dt DATETIME; 
    declare ret VARCHAR(255); 

    set dt = FROM_UNIXTIME(ts); 

    IF DATE_FORMAT(dt, "%Y%m%d") = DATE_FORMAT(NOW(), "%Y%m%d") THEN SET ret = 'Today'; 
    ELSEIF DATE_FORMAT(dt, "%Y%m%d") = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), "%Y%m%d") THEN SET ret = 'Yesterday'; 
    ELSE SET ret = CONCAT(DATE_FORMAT(dt, "%M "), DATE_FORMAT(dt, "%d")); 
    END IF; 

    RETURN ret; 

END $$ 

DELIMITER ; 

Затем можно построить запрос, как это: select niceDate(your_date_field) from table group by niceDate(your_date_field) order by your_date_field desc

отказ от ответственности: я не проверял эту функцию, но вы должны получить эту идею.

+0

Эта функция не принимает во внимание различные годы, когда вход не является ни сегодня, ни вчера, так что 20100728 и 20090728 группируются вместе. –

Смежные вопросы