在mysql / php中生成每周日历

时间:2009-08-14 13:04:35

标签: php mysql calendar

我正在开发用户活动的只读每周日历视图。 列是一周中的几天(mon> sun) 行是时段(8:00> 9:00,9:00> 10:00 ......从上午8点到晚上7点)

问题:生成该用户日历的最佳方法是什么:

选项1:纯SQL 我甚至都不知道这是否可行,但我会发现它非常优雅:让mysql生成一个包含7列(日期)和11行(时间段)的表,并为每个时隙提供子查询,检查是否存在为那个时段/用户预订的会议。

选项2:php / mysql 让mysql只检索预订/用户的会议,然后用php生成的日历交叉。

选项1是否可能?如果是,是资源密集型吗?

谢谢你, 亚历山大

更新:查询建议

这是我用来获取预订事件的“选项2”查询(在这种情况下的课程:用户是教师)。

SELECT DISTINCT date, hour_from, hour_to, courses.description, courses.alias, teachers.name, locations.new_acronym
        FROM timetables
        INNER JOIN courses ON (courses.id=timetables.course_id)
        INNER JOIN teachers ON (teachers.id=timetables.prof_id)
        INNER JOIN locations ON (locations.id=timetables.location_id)
        WHERE ((timetables.prof_id='$id')
           AND (timetables.date >= '$starting_date')
           AND (timetables.date < date_add('$starting_date', INTERVAL 7 day))) ;

我对查询的建议很感兴趣,这会使选项1工作!

3 个答案:

答案 0 :(得分:2)

尝试将日历描述为SQL表听起来不太匹配。当然可以执行一个查询,该查询将生成一个包含7列和11行的表,但那么您将对该生成的表执行什么操作?你仍然需要使用PHP渲染它。

首先假设PHP正在呈现一个日历,并且不再预先使SQL生成一个(以及一个非常特定的一个!)的额外工作。这样,您可以使用单个SQL查询来检索一次性中应该可见的所有事件,然后在绘制时将它们放在日历上。

答案 1 :(得分:0)

我做了类似的事情,我认为一个包含7列和11行的表是一个非常糟糕的解决方案 - 可能但很糟糕。

只有一个表,您可以在其中存储所有“事件”,然后使用php进行渲染。你的日历是更灵活的(想象一下你想要增加一天中的更多时间,或者可以使用半小时,如果你构建它很好,这只是配置设置)。

如果您仍然选择选项1: 我不认为它是非常耗费资源的,我认为你可能能够缓存那些东西,所以它不会很难。

答案 2 :(得分:0)

我在猜,但如果您创建一个包含时间段的表,我认为您可以执行选项1。这将简化很多查询。生成Calendar页面的PHP代码将更加简单:您只需迭代结果集即可。 并且,为了获得良好的性能,您应该创建适当的索引和密钥(我不能事先提出这些)。

编辑提出建议: @pixeline:由于你没有添加表格布局,这是一个黑暗中的拍摄,我想只需将INNER JOIN更改为LEFT OUTER JOIN即可:

    SELECT DISTINCT date, hour_from, hour_to, courses.description, courses.alias, teachers.name, locations.new_acronym
    FROM timetables
    LEFT OUTER JOIN courses ON (courses.id=timetables.course_id)
    LEFT OUTER JOIN teachers ON (teachers.id=timetables.prof_id)
    LEFT OUTER JOIN locations ON (locations.id=timetables.location_id)
    WHERE ((timetables.prof_id='$id')
       AND (timetables.date >= '$starting_date')
       AND (timetables.date < date_add('$starting_date', INTERVAL 7 day))) ;

如果timetables没有当天的所有工作时间,您可以创建一个包含它们的表格(比如timeslot)并将其作为第一个表格,并将时间表作为LEFT OUTER JOINCROSS JOIN。其他人如上LEFT OUTER JOIN