[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запрос выборки ближайших праздников
tim-ua
Необходимо вывести данные в таком виде:

1 января, прздник такойто
храм 1
храм 2
храм 3

2 января, праздник такойто
храм 1
храм 3
храм 4

итд...

таблицы:

hollydays - id, name, date
church - id, name
links(таблица связей) - id, churchid, hollydayid

Как построить запрос так, чтобы выводились 10 ближайших дат в которые есть праздники и к ним храмы к которым прикреплен этот праздник?

Зарание спасибо за любую помощь.



Спустя 3 часа, 40 минут, 15 секунд (17.05.2009 - 17:41) Alchemist написал(а):
свои идеи есть ?

Спустя 22 минуты, 2 секунды (17.05.2009 - 18:03) tim-ua написал(а):
написал это:
PHP
$sql mysql_query("SELECT MONTH(date) AS month, DAY(date) AS day, id, name FROM dbhollydays ");
while (
$var mysql_fetch_array($sql))
{
$FRONT_EPARCHYCALENDAR $FRONT_EPARCHYCALENDAR.'<strong>'.$var['day'].'.'.$var['month'].' | '.$var['name'].'<br></strong>';
$sql2 mysql_query("SELECT dbchurch.id, dbchurch.name FROM dbholinks, dbchurch WHERE dbholinks.hollydayid='{$var['id']}' and dbchurch.id=dbholinks.churchid");
while (
$var2 mysql_fetch_array($sql2))
{
$FRONT_EPARCHYCALENDAR $FRONT_EPARCHYCALENDAR.'----'.$var2['name'].'<br>';
}
}

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

Спустя 28 минут, 46 секунд (17.05.2009 - 18:32) Alchemist написал(а):
ок, значит логически рассуждая, надо где-то в запросах указать, что:

1) дата должна быть не меньше чем нынешняя
2) выводить надо только даты праздников для которых есть храмы
3) выводить надо только первые 10 таких дат

с функциями времени, ты судя по всему, знаком; про ограничение вывода можно почитать тут: http://dev.mysql.com/doc/refman/5.0/en/select.html (поиск по фразе "The LIMIT clause")

сделай это, и будем разбираться с "пустыми" датами

Спустя 1 час, 23 минуты, 12 секунд (17.05.2009 - 19:55) tim-ua написал(а):
1) я без понятия как указать в запросе начало вывода с текущей даты
2) тоже незнаю как
3) limit - разобрался

Спустя 32 минуты, 41 секунда (17.05.2009 - 20:28) Alchemist написал(а):
по первому: http://dev.mysql.com/doc/refman/5.0/en/dat...unction_curdate

по-второму: опять же, давай мыслить логически... Что значит с точки зрения БД "праздник в котором есть храмы" ? Это значит что в таблице links есть строка с содержащая ИД этого праздника и ИД какого-то храма.

Т.е. возвращаясь к задаче выбора дат, тебе надо выбрать только такие даты, для которых есть хоть одна строка в таблице links. Сможешь ?

При этом нельзя забывать, что на одну дату может быть несколько строк...

Спустя 1 час, 14 минут, 24 секунды (17.05.2009 - 21:42) tim-ua написал(а):
Это вершина извращения но работает... как оптимизировать?

PHP
$d1=date('m');
if(
$d1==12)
$d2=1;
else
$d2=$d1+1;

echo $d1.'.'.$d2;
$sql = mysql_query(SELECT MONTH(h.date) AS month, DAY(h.date) AS day, h.id, h.name FROM dbholinks l, dbhollydays h WHERE ((MONTH(date) = '{$d1}' AND DAYOFMONTH(date) >= DAYOFMONTH(CURRENT_DATE)) OR MONTH(date) = '{$d2}') AND l.hollydayid=h.id GROUP BY h.id");
while ($var = mysql_fetch_array($sql))
{
$FRONT_EPARCHYCALENDAR = $FRONT_EPARCHYCALENDAR.'<strong>'.$var['day'].'.'.$var['month'].' | '.$var['name'].'<br></strong>';
$sql2 = mysql_query("
SELECT dbchurch.id, dbchurch.name FROM dbholinks, dbchurch WHERE dbholinks.hollydayid='{$var['id']}' and dbchurch.id=dbholinks.churchid");
while ($var2 = mysql_fetch_array($sql2))
{
$FRONT_EPARCHYCALENDAR = $FRONT_EPARC

Спустя 1 час, 45 минут, 1 секунда (17.05.2009 - 23:27) Alchemist написал(а):
ну если коротко, то:
- лишняя пхп-функция date()
- лишние MySQL-функции MONTH(), DAY(), DAYOFMONTH()
- лишний GROUP BY
- SQL-запрос в цикле

если более пространно, то:
- не понимаю, почему ты боишься сравнивать даты в MySQL. CURRENT_DATE вернет тебе уже готовую нынешнюю дату в формате 'YYY-MM-DD' или 'YYYMMDD', пригодную для почти любых операций, какие ты только можешь захотеть сделать с датой, включая сюда и операции сравнения. Ты же зачем-то берешь эту дату, дробишь ее на составляющие и сравниваешь их по-отдельности... Зачем ?

- вытаскивать отдельно месяц и день можно, но в принципе в MySQL опять же существует функция которая легко выдаст тебе дату в любом удобном для тебя формате: http://dev.mysql.com/doc/refman/5.0/en/dat...ion_date-format

- ты используешь GROUP BY для удаления повторяющихся строк. В некоторых случаях это оправдано, но в данном - совершенно излишне. В SELECT'e есть замечательная опция, которая сюда подойдет гораздо больше.
http://dev.mysql.com/doc/refman/5.0/en/select.html (поиск по фразе "The ALL, DISTINCT, and DISTINCTROW options")

- запрос в цикле не является хорошим делом в принципе. Но удаление цикла потребует существенного изменения пхп-кода, так что я бы рекомендовал это делать уже после того как ты исправишь предыдущие пункты.
Быстрый ответ:

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