Выберите дату в этом году и сгруппируйте по месяцам - PullRequest
0 голосов
/ 07 ноября 2011

Я работаю над страницей событий, где пользователи могут создавать события, а их подписчики могут просматривать события на своей странице событий.

Что я хотел бы сделать, это выбрать все события из таблицы, в которой дата события находится в этом году (2011), поэтому, если дата равна 2011-03-30, она будет отображаться в заголовке марта, но если это 2012-03-30 он не будет отображаться вообще до следующего года.

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

Моя структура таблицы такова:

id                             int(11)
event_creator_user_id          int(11)
event_creator_user_username    varchar(255)
event_creator_user_first_name  varchar(255)
event_creator_user_last_name   varchar(255)
event_name                     varchar(255)
event_date                     date
event_time                     time
event_brief_location           varchar(255)
event_location_street          varchar(255)
event_location_town            varchar(255)
event_location_post_code       varchar(255)
event_description              text
event_create_date              datetime
type                           enum('a','b')

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Я думаю, вы слишком усложнили проблему.Эту проблему можно решить, просто получив все события в текущем году, используя функцию MySQLs DATE_FORMAT и упорядочив события по дате.

Тогда в PHP вы можете просто зациклить их и когдаизменения месяца распечатать заголовок.Код ниже должен сделать это более понятным.

В PHP:

$conn = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("mydbname");

$SQL = "
    SELECT *,
           UNIX_TIMESTAMP(`event_date`) AS event_date_timestamp
    FROM events
    WHERE DATE_FORMAT(event_date, '%Y') = 2011
      AND event_date > NOW()
    ORDER BY event_date ASC";

$result = mysql_query($SQL);

$current_month = '';
while ($event = mysql_fetch_assoc($result)) {
    $month = date('m', $event['event_date_timestamp']);
    if($current_month != $month) {
        $current_month = $month;
        echo '<h1>' . $current_month . '</h1>';
    }
    echo '<p>' . $event['event_name'] . '</p>';
}
2 голосов
/ 07 ноября 2011

Вы можете получить часть года с помощью функции. Предполагая, что это MySQL:

SELECT 
   *,
   MONTH(event_date) AS 'month'
FROM events
WHERE YEAR(event_date) = YEAR(CURDATE())
ORDER BY month ASC
1 голос
/ 07 ноября 2011

В моих базах данных я храню даты как int, так как метка времени unix, количество секунд с 1 января 1970 года. Таким образом, если я хочу выбрать диапазон (например, только месяц марта), я могу использовать mktime :

$query = mysql_query("SELECT * FROM `events` WHERE `date` > ".mktime(0,0,0,3,1,2011). " AND `date` < ".mktime(0,0,0,4,1,2011));

Вы можете перебирать месяцы следующим образом:

for($i=1; $i<=12; $i++){
   $query = mysql_query("SELECT * FROM `events` WHERE `date` > ".mktime(0,0,0,$i,1,2011). " AND `date` < ".mktime(0,0,0,$i+1,1,2011));
   $monthName = date("F",mktime(0,0,0,$i,1,2011)); // full name of the month; use "M" for short-name
   // ... your code for printing the events here
}

Я бы помог с типом данных date, но я не использовал его.

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