【发布时间】:2013-07-30 16:33:09
【问题描述】:
我正在根据子查询查询表 1 中的日期列。 where 子句中的子查询 1 从外键引用的表中获取描述,子查询 2 通过其他条件提取数据。
所以我的问题是,我有什么替代方法可以使这个查询更好?
SELECT count(*) AS non_saturday
FROM t_booking
WHERE p_id IN (
SELECT p_id
FROM p_detail
WHERE p_name IN ('A','B')
)
AND date_format(p_date, '%Y%m%d') IN (
SELECT DISTINCT CONCAT (
gregorian_ccyy
,gregorian_month
,gregorian_day
)
FROM m_gregorian_calendar1 c
WHERE c.day_of_the_week = (
SELECT day_id
FROM m_gregorian_day
WHERE day_name = 'SATURDAY'
)
AND c.gregorian_ccyy = '2012'
AND c.gregorian_month = '10'
)
【问题讨论】:
-
一个建议是考虑使用 JOIN 而不是子查询。
-
正如@bluefeet 提到的,您似乎可以简单地加入您的三个表而不是使用子查询。但是,您不想使用 date_format/concatenation 业务来加入表,因为这不允许使用索引。
-
我忘了提到我添加的 2012 年和第 10 个月是硬编码的,因为这是来自表单。正如建议的那样,我可以使用内部联接,但我认为它会使查询的可读性降低。
-
任何无法阅读连接语法的人都没有资格从事涉及编写查询的工作。