[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Группировка по дате
Slays
Дано: есть события, привязанные к определенной дате и времени


1 - 22.10.2014 15:30 - Первое событие
2 - 22.10.2014 16:30 - Второе событие
3 - 23.11.2014 20:00 - Третье событие
и т.д.

Задача: сгруппировать и вывести все события в порядке их прохождения.
Вид вывода:


дата: 22.10.2014
15:30 - Первое событие
16:30 - Второе событие

дата: 23.11.2014
20:00 - Третье событие

Можно конечно после обращения к базе сперва загнать данные в массив


[22.10.2014] => array( 15:30 => Первое событие, 22.10.2014 16:30 => Второе событие )
[23.11.2014] => array( 20:00 => Третье событие )


а потом еще одним циклом выводить это на сайт. Но может есть более рациональное решение.

_____________
если помог, не скупись на карму =)
kaww
Цитата (Slays @ 23.11.2014 - 11:56)
Но может есть более рациональное решение.

не формировать массив вида
array(
date1 => array(time1 => event, time2 => event),
date2 => array(time1 => event, time2 => event),
)

а сразу выводить, и сэкономить на одном проходе по массиву.
sergeiss
Судя по разделу, это ты хочешь сделать в БД. И где твой запрос, которым ты это делаешь?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Slays
kaww в этом и задача, как такое сделать.
sergeiss, у меня решается созданием дополнительного массива, а можно ли написать 1 запрос для решения этой задачи, я бы и хотел узнать. В какую сторону глядеть ?

Сейчас у меня тупо так


$sql = "SELECT *,
DAYOFMONTH(`date`) AS `day`,
DATE_FORMAT(`date`, '%d.%m.%Y') AS `date`,
TIME_FORMAT(`time`, '%H:%i') AS `time`
FROM `events`
ORDER BY `date` ASC";

$row = $this -> _db -> fetchAll( $sql );

$answer = array();
foreach( $row as $event )
$answer[ $event['date'] ][ $event['time'] ] = $event;


_____________
если помог, не скупись на карму =)
kaww
Slays, запрос получает данные отсортированными по дате, а значит можно выводить как-то так:
$currentDate = null;
foreach($rows as $row) {
if ($currentDate != $row['date']) {

$currentDate = $row['date'];
echo 'Дата:' . $row['date'] . '<br>';
}
echo $row['time'] . ' - ' . $row['name'] . '<br>';
}
sergeiss
Цитата (Slays @ 23.11.2014 - 16:29)
В какую сторону глядеть ?

Не видя твоих данных, сложно точно сказать :)

Мне так кажется, что всё решается банальным ORDER BY
...
ORDER BY field1, field2

тут вместо field1 и field2 можно указать всё, что угодно. Например, функции от каких-то полей.
...
ORDER BY day(datetime_field), time(datetime_field)


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Slays
kaww а, ну это понятно. Только данные формируются в моделе, а потом передаются в вид, сразу вывести не получится.




_____________
если помог, не скупись на карму =)
Slays
sergeiss отсортировать то так можно, а сгруппировать не получится, это мне в виде потом придется много логики писать с if, на проверку таже дата или новая =)


_____________
если помог, не скупись на карму =)
kaww
sergeiss, мне кажется, что на стороне бд вопрос уже решен
Цитата (Slays @ 23.11.2014 - 12:29)
ORDER BY `date` ASC";

, по-моему у ТС'а проблема с выводом полученных данных. Slays, верно?
sergeiss
Цитата (Slays @ 23.11.2014 - 16:46)
потом придется много логики писать с if

Зачем много логики??? Элементарная проверка в ПХП: равна ли дата в текущей строке дате из переменной, куда сохранили дату из предыдущей строки.

Цитата (kaww @ 23.11.2014 - 16:48)
мне кажется, что на стороне бд вопрос уже решен

В том и проблема, что на стороне БД у него нет корректной сортировки. Поэтому он и пытается на стороне ПХП сортировать. Делает лишнюю работу, т.к. это всё в БД можно (и нужно) сделать.

Там нужно по 2-м полям сортировать (как я написал), а у него сортировка только по 1-му полю. Когда будет сортировка по 2-м полям, то в ПХП всё будет очень легко выводиться.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
kaww
Цитата (Slays @ 23.11.2014 - 12:45)
Только данные формируются в моделе, а потом передаются в вид, сразу вывести не получится.

Хм,почему так нельзя ?:
class Model
{
public function getEvents()
{
return $this->_db->fetchAll($sql);
}
}


//view
foreach($model->getEvents() as $event) {
//code..
}
.
kaww
Цитата (sergeiss @ 23.11.2014 - 12:50)
Там нужно по 2-м полям сортировать

Цитата (Slays @ 23.11.2014 - 12:29)
DAYOFMONTH(`date`) AS `day`,
DATE_FORMAT(`date`, '%d.%m.%Y') AS `date`,
TIME_FORMAT(`time`, '%H:%i') AS `time`

судя по всему date имеет тип datetime
sergeiss
Цитата (kaww @ 23.11.2014 - 16:52)
судя по всему date имеет тип datetime

И в чем проблема???

Очень легко решается это
Цитата (sergeiss @ 23.11.2014 - 16:44)
...
ORDER BY day(datetime_field), time(datetime_field)


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
AllesKlar
Можно конечно после обращения к базе сперва загнать данные в массив

[code][22.10.2014] => array( 15:30 => Первое событие, 22.10.2014 16:30 => Второе событие )
[
23.11.2014] => array( 20:00 => Третье событие )[/code]


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

Если ты не используешь шаблоны, то тебе достаточно массива с чистыми данными из базы:
[0] => array('date' => '2014-10-22 15:30', 'event' => 'Первое событие')
[1] => array('date' => '2014-10-22 16:30', 'event' => 'Второе событие')
[2] => array('date' => '2014-10-23 20:00', 'event' => 'Третье событие')


И выводить это одним циклом:
$cur_date = null;
foreach($events as $event)
{
$date = date('d.m.Y', strtotime($event['date']));
$time = date('H:i', strtotime($event['date']));
if($date != $cur_date)
{
$cur_date = $date;
echo "дата: " . $date . '<br>';
}
echo $time . ' - ' . $event['event'] . '<br>';
}


_____________
[продано копирайтерам]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.