2013-08-29 23 views
0

我有一個事件表,每個事件都有一個開始日期和一個結束日期。當天發生的事件列表

我需要顯示天數列表並顯示每天發生哪些事件。

E.g.說我有對事件運行週一至週三,另一個是運行週二至週四,我想創建這樣一個表:

Mon: Event 1 
Tue: Event 1, Event 2 
Wed: Event 1, Event 2 
Thu: Event 2 

我可以看到通過運行一個查詢要做到這一點無論是唯一的辦法每天或通過加載給定日期範圍內的所有事件,然後在我的代碼中複製它們,如果它們持續超過一天。這兩種方法看起來都很詭異,我敢肯定我錯過了一些東西。

有沒有更好的方法來做到這一點?

結構:

id   INT 
name  VARCHAR 
start_date DATE 
end_date DATE 

當前查詢(略簡單,因爲這個數據庫結構是慘不忍睹):

SELECT * 
FROM events 
WHERE start_date <= $somedate 
AND end_date >= $somedate 

...其中$ somedate是一個給定的日期。 (是的,我在我的代碼中正確轉義它)

+1

你能發表您的查詢嗎? – Kuzgun

+1

請提供一些結構數據 –

+0

@Kuzgun我已更新我的問題。 –

回答

1

選擇您的事件特定的日期範圍(我假設一個特定的月份)。然後循環在那個月的日子,並有另一個內部循環,顯示該日期發生的任何事件。

<?php 
$events = getEvents(); // some function that returns events from database 

echo '<ol class="calendar">'; 
for ($i = 1; $i <= cal_days_in_month(); $i++) { 
    echo '<li>'; 

    $beginning = mktime(0, 0, 0, date('n'), $i, date('Y')); 
    $end = mktime(23, 59, 59, date('n'), $i, date('Y')); 
    $events_on_day = array(); 

    foreach ($events as $event) { 
     if ($event->start_date <= $end && $event->end_date >= $beginning) { 
      $events_on_day[] = $event; 
     } 
    } 

    if ($events_on_day > 0) { 
     echo '<ul>'; 
     foreach ($events_on_day as $event_on_day) { 
      echo '<li>' . $event_on_day->name . '</li>'; 
     } 
     echo '</ul>'; 
    } 
} 
echo '</ol>'; 
?> 
+0

我認爲直接在SQL中執行此操作可能更有效,但由於時間限制和現有系統的不靈活性,我最終使用此方法。謝謝! –

1

首先,你必須得到每個事件的start_date和end_date之間的所有日期。 放入溫度。表格如:

|Weekday| Event_name| 
|Mo  | Event1 | 
|Tu  | Event1 | 
|We  | Event1 | 
|We  | Event2 | 
|Th  | Event2 | 
|Fr  | Event2 | 

然後在星期幾之前按group_concat分組。

此鏈接將幫助你得到開始和每個事件: Get a list of dates between two dates

1

有可能是一個更好的辦法的結束日期之間的日期,但是從我的頭頂,我想說創建的表可能的日期,然後簡單地

select * from events 
inner join possibleDates on possibleDates.Date >= start_date and possibleDates.Date <= end_date 
1

如果非要你能做到在一個查詢,但我會建議得到像揚Zeiseweis平日表也暗示。 Working SQLfiddle:http://www.sqlfiddle.com/#!2/e618d9/1/0

SELECT wk.day, GROUP_CONCAT(e.name, '') events 
FROM (
    SELECT 'Monday' day, 0 dayIndex 
    UNION 
    SELECT 'Tuesday' day, 1 dayIndex 
    UNION 
    SELECT 'Wednesday' day, 2 dayIndex 
    UNION 
    SELECT 'Thursday' day, 3 dayIndex 
    UNION 
    SELECT 'Friday' day, 4 dayIndex 
    UNION 
    SELECT 'Saturday' day, 5 dayIndex 
    UNION 
    SELECT 'Sunday' day, 6 dayIndex 
) wk 
LEFT JOIN Events e 
    ON WEEKDAY(e.start) <= wk.dayIndex 
    AND WEEKDAY(e.end) >= wk.dayIndex 
GROUP BY wk.day ORDER BY wk.dayIndex 
相關問題