2009-08-14 166 views
0

我正在开发用户事件的只读每周日历视图。 列是星期几(mon> sun) 行是时隙(8:00> 9:00,9:00> 10:00 ...从8AM到7PM)在mysql/php中生成每周日历

问题:什么是最好的办法来生成该用户日历:

选项1:纯SQL 我甚至不知道这是否可能,但我会发现它超级优雅:有MySQL生成一个表7列(日)和11行(时隙)并对每个时隙进行子查询,检查是否为该时隙/用户预订了会议。

选项2:php/mysql 有mysql只是检索预定/会议的会议,并与php生成的日历交叉。

选项1是否可能?如果是这样,是否资源密集?

谢谢 亚历山大

UPDATE:查询建议

这里是“选项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工作!

+0

如果您需要查询的suggetions,添加desc表,我(我们)会发布一些。 – 2009-08-15 11:58:33

+0

只是相应地更新了问题。谢谢。 – pixeline 2009-08-15 14:17:38

回答

2

试图将日历描述为SQL表格听起来不太合适。当然可以执行一个查询,该查询将生成一个包含7列和11行的表,但那么您将如何处理生成的表?您仍然必须使用PHP进行渲染。

因此,首先假设PHP正在渲染一个日历,并取消SQL预先生成一个(以及非常特定的一个!)的额外工作。通过这种方式,您可以使用单个SQL查询来检索一次可见的所有事件,然后在绘制日历时将它们放在日历中。

0

我做了这样的事情,我认为有7列和11行的表是一个非常糟糕的解决方案 - 可能但不好。

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

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

+1

我认为当他说“mysql生成表”时,OP会提供一个SELECT QUERY结果集。所以,如果他放了另一个时隙,查询会自动添加更多的行。确实是 – 2009-08-14 14:11:59

+0

。我的问题不是关于数据库设计,而是关于一个选择查询,它将返回每周日历完成,时间充满了预订的事件,一个数据结果集,我只需要在一个简单的循环中用php来解析呈现html表格。 – pixeline 2009-08-15 08:56:49

0

我猜,但我想你可以做选项1,如果你创建一个表的时间。这将简化很多查询。生成日历页面的PHP代码将非常简单:您只需迭代结果集即可。 而且,为了获得良好的表现,你应该创建适当的索引和关键(我不能提前给你提供)。

编辑补充建议: @pixeline:既然你没有添加表格布局,这是一个在黑暗中拍摄,BU我觉得只是改变了INNER JOIN s到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如上。

+0

事实上,事件存储在一个表格中,时间片段存储在另一个表格中。我得到了经典的“获取该用户的所有事件的那一周”查询罚款。我发现循环遍历每周的时间段,并发现匹配这些结果相当复杂,这就是为什么我认为也许一个聪明的MySQL查询可能只是返回我的日历,哪些PHP只需要循环呈现表。 – pixeline 2009-08-15 08:49:56