You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL同表查询仅第2周预约及第1、2周预约日期不同的学生记录

第二类条件SQL实现方案

方案1:基于日期拼接比对(兼容绝大多数SQL dialect)

核心逻辑是先分别汇总每个学生两周的预约日期,排序后拼接成字符串进行比对,不一致即符合要求:

SELECT DISTINCT w1.childid
FROM (
    -- 汇总每个学生第1周的所有预约日期,去重后按顺序拼接
    SELECT 
        childid,
        GROUP_CONCAT(DISTINCT `Day` ORDER BY `Day`) AS week1_days
    FROM booking
    WHERE `Week` = 1
    GROUP BY childid
) w1
INNER JOIN (
    -- 汇总每个学生第2周的所有预约日期,去重后按顺序拼接
    SELECT 
        childid,
        GROUP_CONCAT(DISTINCT `Day` ORDER BY `Day`) AS week2_days
    FROM booking
    WHERE `Week` = 2
    GROUP BY childid
) w2 ON w1.childid = w2.childid
-- 筛选两周预约日期不一致的学生
WHERE w1.week1_days <> w2.week2_days

用你给出的示例数据测试,该查询会返回ChildId = 3的记录,符合预期。

方案2:基于集合差集比对(支持EXCEPT/MINUS的数据库可用,如PostgreSQL、SQL Server等)

直接判断两周的预约日期集合是否存在差异:

SELECT DISTINCT b.childid
FROM booking b
WHERE b.`Week` = 2
-- 存在第1周有但第2周没有的日期,或第2周有但第1周没有的日期
AND (
    EXISTS (
        SELECT `Day` FROM booking WHERE childid = b.childid AND `Week` = 1
        EXCEPT
        SELECT `Day` FROM booking WHERE childid = b.childid AND `Week` = 2
    )
    OR EXISTS (
        SELECT `Day` FROM booking WHERE childid = b.childid AND `Week` = 2
        EXCEPT
        SELECT `Day` FROM booking WHERE childid = b.childid AND `Week` = 1
    )
)

内容的提问来源于stack exchange,提问作者snowflakes74

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:15:03