2013-08-29 9 views
0

각 이벤트에는 시작 날짜와 종료 날짜가있는 이벤트 테이블이 있습니다.해당 일에 발생한 이벤트가있는 요일 목록

일 목록을 표시하고 매일 발생하는 이벤트를 표시해야합니다.

예.

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 사이에 모든 날짜를 가져야합니다. 임시 직원을 배치하십시오. 테이블과 같은 : 평일에 의한 그룹 별 이벤트 GROUP_CONCAT

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

다음.

이 링크는 시작과 각 이벤트 : 아마있다 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

필자가 꼭 알아야 할 것이지만 Jan Zeiseweis와 같은 평일 테이블을 사용하는 것이 좋습니다. 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