Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сортировка записей БД по датам для блога
 
 автор: rusbi   (24.06.2007 в 17:30)   письмо автору
 
 

Здравствуйте.
Пишу простенький блог.
Дошел до момента, когда нужно в правом блоке вывести архив по месяцам, за которые есть заметки.
Видели наверное на многих блогах

Архив:
Апрель 2007
Май 2007
Июнь 2007


Каждая заметка в базе у меня имеет поле date (тип date), в котором хранится дата создания заметки в формате xxxx-xx-xx.

Как мне в цикле проверить все записи в БД и если например, найдена запись за 2007-05-23, то вывести в блоке: Май 2007, если найдена за 2007-06-23 то соответственно сл. строка будет Июнь 2007, причем, если хоть одна заметка за месяц уже найдена, то больше его (месяц) выводить естественно не нужно.

Помогите если есть идеи.

   
 
 автор: Osipov   (24.06.2007 в 17:39)   письмо автору
 
   для: rusbi   (24.06.2007 в 17:30)
 

select left(дата,7) as month from заметки group by month;

Этот SQL-запроc выведет каждый месяц один раз. Только совет храните дату не как xxxx-xx-xx, а как DATETIME.

   
 
 автор: rusbi   (24.06.2007 в 18:08)   письмо автору
 
   для: Osipov   (24.06.2007 в 17:39)
 

Спасибо, получилось.
Вот код:


<div class="title" align="center">Архив</div>
<?php 
$result 
mysql_query("SELECT left(date,7) AS month FROM blog_data GROUP BY month",$db);  
$myrow mysql_fetch_array($result);

if (
$result) {

do 
{
printf("<div class='td'>%s</div>",$myrow["month"]);
}
while (
$myrow mysql_fetch_array($result));                    
}
?>


Если не сложно, объясните, что значит синтаксис left(date,7) AS month, впервые с таким сталкиваюсь.

   
 
 автор: rusbi   (24.06.2007 в 18:12)   письмо автору
 
   для: rusbi   (24.06.2007 в 18:08)
 

И почему нужно хранить дату не как xxxx-xx-xx, а как DATETIME

   
 
 автор: cheops   (25.06.2007 в 11:13)   письмо автору
 
   для: rusbi   (24.06.2007 в 18:12)
 

Потому, что строки в произвольном формате сортируются как строковые значения, а дата в формате xxxx-xx-xx сортируется календарно.

   
 
 автор: Osipov   (25.06.2007 в 15:08)   письмо автору
 
   для: rusbi   (24.06.2007 в 18:12)
 

1. DATETIME. У вас с сортировкой дат всё будет нормально (вы удачно выбрали формат хранения), но во-первых дата храниться неоптимально --- вы тратите десять байт на хранение одной даты, в то же время можно меньше, во вторых становятся доступными функции MySQL для работы с датой (то есть "день", "месяц", "дата, которая будет через n часов" и т. п.). Также если я не ошибаюсь есть специльный тип для даты: DATE и для времени TIME, в то время, как DATETIME --- хранит момент времени с точностью до секунды (или до милисекунды, не помню точно). Если бы у вас эта запись была бы date, то работал бы запрос: SELECT MONTH(date) as month, DAYOFMONTH(date) as day GROUP BY month,day.

2. LEFT. Наряду с именами столбцов в запросе SELECT ... могут стоять ещё и функции, например, SELECT COUNT(*) FROM table; выведет количество всех записей таблицы. Функция LEFT(s,n) возвращает n первых символов строки s. Если бы я просто написал "SELECT LEFT(дата,7) FROM таблица", то у каждой строчки вывелись первые семь символов даты, и среди них могли бы быть повторяющиеся, запрос содержал бы один столбец без имени. Для того, чтобы дать столбцу имя используется конструкция "as". То есть "as month" просто означает, что данный столбец будет так "month". Дальше мы просим убрать повторяющиеся результаты из столбца с именем month

3. Ваш цикл можно было записать как

while ($myrow = mysql_fetch_array($result))
{
print "<div class=\"td\">$myrow[month]</div>";


Без предварительной инициализации $myrow.

4. Когда у вас будет очень много записей в таблице и вам нужно будет выводить их постранично, используйте SELECT ... LIMIT n,m, которое выводит m записей, начиная с m+1-ой.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования