[英]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.