簡體   English   中英

填充日歷的最有效方法?

[英]Most efficient way to populate a calendar?

我建立了一個簡單的PHP日歷,顯示了12個月的時間。 我有一個保存日歷事件的MySQL數據庫。 我想用我的活動填充日歷。 我當然可以每天運行一個MySQL查詢,但是365個查詢似乎效率很低,就像運行一個MySQL查詢並循環搜索結果365次一樣。 有什么替代方案? 是否有一種簡單有效的方法?

$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();
}

然后,使用1個查詢獲取2014年的數據,並使用數組$ calendarEvents訪問它們。 對於每一天,您都具有按ID排列的所有事件,因此,通過foreach循環,您可以獲得當天的所有事件,其順序與查詢順序相同

  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"];

     }

 }

要為您提供一個一年中每天一行的結果集,並將當天的所有事件(如果有的話)串聯到另一列中,您可以執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM