0

我正在根据子查询查询表 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'
        )
4

1 回答 1

2

这可能不是您问题的直接答案,但是如果您所说的“星期六”是指直接的星期六(而不是某些日历,日期和星期几之间的映射不同),在我看来,您可以简单地跑

SELECT count(*) AS non_saturday
    FROM t_booking
    JOIN p_detail ON (t_booking.p_id = p_detail.p_id AND p_name IN ('A','B'))
    WHERE
        DAYOFWEEK(p_date) = 7
        AND MONTH(p_date) = 10
        AND YEAR (p_date) = 2012

p_date或者为了更好地在字段上使用索引,

    WHERE p_date BETWEEN "2012-10-01" AND "2012-10-31"

(但在使用BETWEEN日期字段时,还要检查这个答案)。

于 2013-07-30T16:48:18.707 回答