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 "); |
но выводит все подрят праздники, а не т что будут от текущего числа, и праздники в которых нт храмов выводить не нужно
Спустя 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) дата должна быть не меньше чем нынешняя
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 - разобрался
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. Сможешь ?
При этом нельзя забывать, что на одну дату может быть несколько строк...
по-второму: опять же, давай мыслить логически... Что значит с точки зрения БД "праздник в котором есть храмы" ? Это значит что в таблице links есть строка с содержащая ИД этого праздника и ИД какого-то храма.
Т.е. возвращаясь к задаче выбора дат, тебе надо выбрать только такие даты, для которых есть хоть одна строка в таблице links. Сможешь ?
При этом нельзя забывать, что на одну дату может быть несколько строк...
Спустя 1 час, 14 минут, 24 секунды (17.05.2009 - 21:42) tim-ua написал(а):
Это вершина извращения но работает... как оптимизировать?
PHP |
$d1=date('m'); |
Спустя 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")
- запрос в цикле не является хорошим делом в принципе. Но удаление цикла потребует существенного изменения пхп-кода, так что я бы рекомендовал это делать уже после того как ты исправишь предыдущие пункты.
- лишняя пхп-функция 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")
- запрос в цикле не является хорошим делом в принципе. Но удаление цикла потребует существенного изменения пхп-кода, так что я бы рекомендовал это делать уже после того как ты исправишь предыдущие пункты.