|
|
|
| Здравствуйте.
Пишу простенький блог.
Дошел до момента, когда нужно в правом блоке вывести архив по месяцам, за которые есть заметки.
Видели наверное на многих блогах
Архив:
Апрель 2007
Май 2007
Июнь 2007
Каждая заметка в базе у меня имеет поле date (тип date), в котором хранится дата создания заметки в формате xxxx-xx-xx.
Как мне в цикле проверить все записи в БД и если например, найдена запись за 2007-05-23, то вывести в блоке: Май 2007, если найдена за 2007-06-23 то соответственно сл. строка будет Июнь 2007, причем, если хоть одна заметка за месяц уже найдена, то больше его (месяц) выводить естественно не нужно.
Помогите если есть идеи. | |
|
|
|
|
|
|
|
для: rusbi
(24.06.2007 в 17:30)
| | select left(дата,7) as month from заметки group by month;
Этот SQL-запроc выведет каждый месяц один раз. Только совет храните дату не как xxxx-xx-xx, а как DATETIME. | |
|
|
|
|
|
|
|
для: 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:08)
| | И почему нужно хранить дату не как xxxx-xx-xx, а как DATETIME | |
|
|
|
|
|
|
|
для: rusbi
(24.06.2007 в 18:12)
| | Потому, что строки в произвольном формате сортируются как строковые значения, а дата в формате xxxx-xx-xx сортируется календарно. | |
|
|
|
|
|
|
|
для: 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-ой. | |
|
|
|