我有一个包含这些表的MySQL数据库:
sessions
--------
sessionid (INT)
[courseid (INT)]
[locationid (INT)]
[comment (TEXT)]
dates
-----
dateid (INT)
sessionid (INT)
date (DATE)
courses
-------
...
locations
---------
...
每个会话都有一个唯一的sessionid,每个日期都有一个唯一的dateid。但是日期不一定具有唯一的sessionid,因为会话可以跨越可变数量的日期(不一定是连续的)。
选择每个完整行只是加入sessionid上的表。但是,我正在寻找一种方法来返回特定courseid的行集,其中该行集中的每一行代表一个位置,并包含另一个行集,每个行集包含单个会话,而该行集又包含另一个行集,其中包含所有该会议的日期:
course
location
sesssion
date
date
session
date
date
date
location
...
这是因为我正在使用Zend Framework从PHP查询这个数据库,它有一个很好的界面来以面向对象的方式操作行和行集。
最终,我正在尝试向视图输出“时间表”,首先按课程,然后是位置,然后是日期。理想情况下,我可以迭代每一行作为一个位置,然后对每个位置迭代每个会话,然后为每个会话迭代每个日期。
我正在考虑通过分别查询所有位置,会话和日期来做到这一点。然后,我将每个行集转换为一个数组,并将每个会话数组添加为位置数组的成员,并将每个日期数组添加为会话数组的成员。
然而,这感觉非常糟糕,并且不能让我以面向对象的方式处理行。
我想知道是否有:
a)用于表示此数据的更好的表模式;
b)我不知道的SQL查询;
c)Zend_Db中的一个方法,它允许我将行集分配给行集
如果我在任何地方都不清楚,请告诉我,并提前致谢。
(穿过我的手指,这并不是每天的重量......)
答案 0 :(得分:2)
当我必须处理来自多个表的数据时,我遇到了使用Zend Frameworks数据库抽象类的许多问题。运行的查询数量和生成的所有对象的开销使我的托管服务器瘫痪了。我已经回过头来编写查询来收集我的所有数据,然后走数据来构建我的显示器。使用抽象层并不是一个漂亮的或OO,但它也没有将我的PHP脚本页面设置为磁盘只是为了显示一个充满数据的表。
正如史蒂夫提到的那样,无论你最终得到什么解决方案,我都会对你的内存使用情况进行分析。
答案 1 :(得分:1)
您可以使用Zend_ Db_ Table的关系功能来处理此场景。如果您当前使用Zend_ Db_ Aadpter作为查询,则需要为会话,日期,课程等创建表包装器类。
http://framework.zend.com/manual/en/zend.db.table.relationships.html
它与您描述的分别查询每个数据集的方法没有什么不同,但它为您提供了一个直接的OO接口,用于检索给定记录的相应相关数据。
如果你走这条路,你会想做一些基准测试,因为它可能会执行很多查询。