PHP / mysql: как отобразить записи, отсортированные по времени и сгруппированные по дате? - PullRequest
2 голосов
/ 22 июня 2011

Мне нужно отобразить записи, сгруппированные по дате и отсортированные по времени.В таблице mysql у меня есть поле с именем entry_time, в котором хранятся значения php time().Любые идеи, что было бы наиболее компактным и простым способом сделать это?

Пример: мне нужен дисплей, как:

21st April
3:00 pm
3:50 pm

22 April
5:00 am
4:00 pm

Ответы [ 7 ]

2 голосов
/ 22 июня 2011

Грубый полупсевдокод:

$records = /* SELECT * FROM `records` ORDER BY `entry_time` */;

$date = null;
foreach ($records as $record) {
    $currentDate = date('Ymd', $record['entry_time']);
    if ($currentDate != $date) {
        printf('<h1>%s</h1>', date('Y-m-d', $record['entry_time']));
    }
    $date = $currentDate;

    echo date('H:i', $record['entry_time']);
}
1 голос
/ 22 июня 2011

Если вы обрабатываете результаты запроса с помощью PHP, попробуйте написать простой запрос для сортировки записей по дате:

SELECT NameOfMyThing, MyDateField FROM MyTable ORDER BY MyDateField DESC

Затем используйте PHP для чтения результатов:

$last_day = '';
while ($row = $query_result->fetch()) {
    $date = new DateTime($row->['MyDateField']);

    $day = $date->format('j F');     // '9 April'
    $time = $date->format('g:i a');  // '9:05 am'

    if ($day != $last_day) {
        print $day . "\n";
        $last_day = $day;
    }

    print $time . " " . $row->['NameOfMyThing'];
}

Идея состоит в том, чтобы запомнить последний день, который вы видели, и выводить только дату, когда день меняется.

(код не проверен, оптимизирован только для удобства чтения).

0 голосов
/ 22 июня 2011

запрос:

SELECT DATE_FORMAT( entry_time, '%D %M' ) as date,
       GROUP_CONCAT( DATE_FORMAT( entry_time, '%h:%i %p' )
                     ORDER BY entry_time ASC
                     SEPARATOR '<br />' ) as times
FROM yourtable
GROUP BY DATE( entry_time )
ORDER BY entry_time

приводит к:

> date        times

> 21st April  3:00 PM<br />3:50 PM

> 22st April  5:00 AM<br />4:00 PM

, затем вы можете пройти его:

foreach($result as $row) {
   echo $row->date. '<br />'. $row->times. '<br />';
}

изменить: преимущество заключается в том, что вся сортировка и форматирование выполняются в движке mysql, поэтому у вас есть готовый результат для отображения

edit2: Этот запрос даст вам именно тот результат, который вы хотите:

SELECT CONCAT( DATE_FORMAT( entry_time, '%D %M' ), "<br />\n",
               GROUP_CONCAT( DATE_FORMAT( entry_time, '%h:%i %p' )
                             ORDER BY entry_time ASC
                             SEPARATOR '<br />' ), "<br /><br />\n"
       ) as dates
FROM yourtable
GROUP BY DATE( entry_time )
ORDER BY entry_time

используйте foreach (или любой другой массив функций), чтобы пройти через него:

foreach($result as $row) { echo $row->dates; }

0 голосов
/ 22 июня 2011

Я мог бы думать слишком просто, но думаю, что это можно сделать с помощью:

SELECT DATE(`datefield`) `date`, TIME(`datefield`) `time` FROM `yourtable` ORDER BY `datefield` ASC;

А затем просто покажите это с помощью PHP.MySQL предназначен только для извлечения данных, а не для их отображения.:)

0 голосов
/ 22 июня 2011

SQL-запрос, подобный этому (на примере WordPress), вы получите записи в правильном порядке и с правильным форматированием:

select date_format(post_date, "%d %b")  as day, date_format(post_date, "%T") as time from wp_posts;

Затем можно выполнить итерацию по этому массиву и начать новый заголовок «день» при каждом изменении первого столбца.

Я бы действительно не рекомендовал запрашивать db по одной строке за раз, как это было предложено в комментарии @ Lainlwakura - PHP медленный, итерации по однорядным запросам медленные Сортировка массива PHP, особенно по строковым ключам, невероятно медленная. Если вы перечисляете записи за год или около того, такой подход не сработает.

Пусть mysql сделает для вас столько, сколько сможет.

0 голосов
/ 22 июня 2011

Если в базе данных хранится time(), самый простой способ:

  1. Сортировать таблицу по столбцу с time().
  2. Запрос отметки времени каждой записи из таблицы (я предполагаю, что вам нужны только даты и время).
  3. Для каждой строки в результате, наберите date() дважды: один раз для дня и месяца, один для часа. Сохраните последнюю использованную дату и, если они совпадают, в следующий раз поместите в тот же элемент массива, что и в предыдущее (я предполагаю, что вы используете решение LainIwakura для хранения таких данных).
  4. Покажите его так, как вы хотите.
0 голосов
/ 22 июня 2011

Имеет многомерный массив.

$datetime = array("April 21st" => array("5:00a.m", "4:00p.m"), "April 22nd" => array(...));

Затем можно сортировать по дате и времени отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...