Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > ВЫборка из БД и "удобное" отображение данных


Автор: Snowball 29.1.2008, 18:04
Цитата

В базе данных mySQL имеется таблица tvtable:
air    datetime
title    varchar(50)

В ней хранится программа передач. Например:
2003-10-20 17:00    Factor
2003-10-20 18:00    Factor
2003-10-20 19:00    Form
2003-10-21 14:00    Factor
2003-10-21 15:00    Form
2003-10-21 17:00    Factor
2003-10-22 17:00    Factor
2003-10-22 18:00    Factor
2003-10-22 19:00    Factor
2003-10-23 18:00    Factor

На запрос "Factor" PHP-скрипт должен вернуть
пн-ср: 17:00
пн,ср-чт: 18:00
вт: 14:00
ср: 19:00



Помогите реализовать! Хотя бы алгоритмом. 
Заранее благодарен.

Автор: NNaarreekk 29.1.2008, 23:45
Лучше измени способ хранения в базе, а то так очень сложно будет учесть все!

Я тоже что-то вроде этого сделал и из за неудобного хранения данных долго мучался!

Автор: SelenIT 30.1.2008, 00:19
В том виде, как есть, имхо, проще всего сделать сделать следующее:
Код

SELECT air, WEEKDAY(air) as weekday, DATE_FORMAT(air, '%H:%i') as airtime
FROM tvtable
WHERE title = 'Factor'
AND air BETWEEN (CURDATE() - INTERVAL WEEKDAY(CURDATE()) DAY) AND (CURDATE() + INTERVAL (7-WEEKDAY(CURDATE()) DAY) /* текущая неделя */
GROUP BY airtime, weekday
ORDER BY airtime, weekday

Потом в скрипте проверять, идут ли дни недели для одного и того же времени подряд (в цикле сравнивая их с предыдущим значением) и в зависимости от этого формировать диапазон или через запятую, или через дефис. Названия дней недели тоже подставлять в скрипте, из массива. Лично я бы собирал результаты в ассоциативный массив "время => массив дней, когда это время встречается в программе" - так будет проще оперировать диапазонами и менять порядок вывода.

Оптимизировать структуру базы можно, разделив дату и время на разные поля, и поставив индексы на оба из них.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)