我有一个数据库,其中包括以下两个表:
classes
是一个简单的表格,在课程表中每个班级都有一行。
sessions
是一个表格,描述了每个班级遇到的日期和时间,其中每一行都能够表达如下概念:
“周二 | 1 月 22 日至 3 月 5 日 | 6-9pm”
“周二和周四 | 1 月 22 日至 3 月 7 日 | 6-9pm”
“周一至周四 | 1 月 21-24 日 | 3-6pm”
“周六 | 3 月 9 日 | 9am-下午4点”
等等。
sessions
中的每一行保证至少有一行classes
,并且对于某些类,可能有两个或更多关联的会话行。
目前,我正在使用两个不同的查询来获取与特定条件集匹配的类的类和会话信息,如下所示:
select c.class_id, c.title, c.instructor, c.num_seats, c.price
from classes c
join classes_by_department cbd
on (cbd.class_id = c.class_id)
join /* several other tables */
on /* several other join conditions */
where cbd.department_id = '{$dept_id}'
and /* several other qualifying conditions */
;
还有这个:
select s.class_id, s.start_date, s.end_date, s.day_bits, s.start_time, s.end_time
from sessions s
join classes c
on (c.class_id = s.class_id)
join classes_by_department cbd
on (cbd.class_id = s.class_id)
join /* the same other tables */
on /* the same other join conditions */
where cbd.department_id = '{$dept_id}'
and /* the same other qualifying conditions */
;
这工作得很好,而且——至少在当前的应用程序中——表不够大,流量也不够大,两个查询都不是问题。尽管如此,它让我觉得有点浪费,我想知道是否没有办法更好地利用第一个查询已经完成的工作来执行第二个查询(而不是相当于运行相同的查询两次和只是选择不同的列)。
当然,我意识到我可以从单个查询(第二个)中选择所有相关列classes
,sessions
但我喜欢这样一个事实,即在当前方法中,第一个查询为每个符合条件的类提供一行,而不是作为许多行,因为该类具有会话记录。如果合并查询,我将需要重组处理查询结果的现有逻辑。(是的,我知道,哇……)
我想到的一个解决方案是将第一个查询返回的所有 s 收集class_id
到一个向量中(因为无论如何我都必须遍历这些结果),然后将该向量的内容格式化为子句的值列表IN
的内容,因此第二个查询将简单地变为:
select s.class_id, s.start_date, s.end_date, s.day_bits, s.start_time, s.end_time
from sessions s
where s.class_id in (/* value-list */);
我不太担心这种解决方案的可扩展性,因为我知道大型 SQL 查询没什么大不了的。另外,它可以利用在sessions.class_id
.
但是......嗯......对于那些希望提高他的 SQL 能力的人来说,这并不是很令人满意,我会坦率地承认这是相当初级的。它感觉不优雅,而且不是很“SQL-ish”,或者任何与Pythonic等价的 SQL是什么。
任何人都可以提出更合适的建议吗?