2014-03-25 2 views
0

나는 12 개월 기간을 표시하는 간단한 PHP 달력을 만들었습니다. 달력 이벤트를 보유하고있는 MySQL 데이터베이스가 있습니다. 내 일정에 내 일정을 채우고 싶습니다. 당연히 매일 MySQL 쿼리를 실행할 수 있지만 365 개의 쿼리는 단일 MySQL 쿼리를 실행하고 결과를 365 번 반복하는 것과 같이 매우 비효율적 인 것처럼 보입니다. 대체 무엇입니까? 이 작업을 수행하는 간단하고 효율적인 방법이 있습니까?캘린더를 채우는 가장 효율적인 방법은 무엇입니까?

+0

모두는 출력에 따라 다릅니다. – andrewb

+0

요일을 키로 사용하여 배열을 만든 다음 1..365 루프 내에서 사용합니다. – Vatev

+0

테이블 구조는 무엇입니까? – Kickstart

답변

0
$query = "SELECT idEvent, day, hour , event from calendar where year = 2014 order by day, hour "; 

$calendarEvents = array(); 

if ($result = $mysqli->query($query)) { 

    /* fetch associative array */ 
    while ($row = $result->fetch_assoc()) { 

     $calendarEvents[ $row["day"] ][ $row["idEvent"] ] = $row; 

    } 

    /* free result set */ 
    $result->free(); 
} 

그런 다음 2014 년 1 개의 검색어로 데이터를 가져와 배열 $ calendarEvents에 액세스합니다. 매일 당신이

for($i = 1; $i < 365 ; $i++){ 

$date = date("Y-m-d" , strtotime("2013-12-31 + $i day")); 

    foreach($calendarEvents[ $date ] as $idEvent => $c){ 

     echo $idEvent . " -- ".$date." - ". $c["hour"]." - ".$c["event"]; 

    } 

} 
+0

나는 이것이 정확히 내가 찾은 것, 감사하다고 생각한다. 특정 날짜에 하나 이상의 이벤트가 있었다면 어떻게 그 이벤트를 모두 호출 할 수 있습니까? – Jules

+0

편집을 찾으십시오. 매일 id로 요소를 추가 한 다음 foreach 루프를 사용하면 해당 날짜의 모든 요소에 액세스합니다. – chofer

0

당신에게 올해의 하루에 한 행과 결과 집합을 제공하기 위해 질의 순서와 동일한 순서로 그 날의 모든 이벤트를 가져 foreach 루프를 가진, 그래서 당신은 ID를 기준으로 모든 이벤트를 그 날의 모든 이벤트 (있는 경우)를 다른 열에 연결하면 다음과 같이 할 수 있습니다. -

SELECT DateSub.aDay, GROUP_CONCAT(CONCAT_WS(':', SomeCalendarTable.eventName, SomeCalendarTable.startTime, SomeCalendarTable.endTime)) AS DaysEvents 
FROM 
(
    SELECT DATE_ADD('2014/01/01', INTERVAL (Units.DayNo + Tens.DayNo * 10 + Hundreds.DayNo * 100) DAY) AS aDay 
    FROM 
    (SELECT 1 AS DayNo UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) Units, 
    (SELECT 1 AS DayNo UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) Tens, 
    (SELECT 1 AS DayNo UNION SELECT 2 UNION SELECT 3 UNION SELECT 0) Hundreds 
    HAVING YEAR(aDay) = '2014' 
) DateSub 
LEFT OUTER JOIN SomeCalendarTable 
ON DateSub.aDay = SomeCalendarTable.calendarDate 
GROUP BY DateSub.aDay 
관련 문제