You need to enable JavaScript to run this app. 如何在MySQL中查询各用户首次与末次选择的配送日
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中查询各用户首次与末次选择的配送日

实现方案

以下三种方案均可实现需求,可根据你的MySQL版本和业务场景选择:


方案1:兼容所有MySQL版本(聚合+关联查询,稳定性最高)

核心用到的函数:MIN()、MAX()、GROUP BY、JOIN

SELECT 
    t.user_id,
    t1.Day AS first_day,
    t2.Day AS last_day
FROM (
    -- 先统计每个用户的最早、最晚更新时间
    SELECT 
        user_id,
        MIN(DateUpdate) AS min_date,
        MAX(DateUpdate) AS max_date
    FROM 你的表名 -- 替换为实际表名
    GROUP BY user_id
) t
-- 关联取首次选择的配送日
JOIN 你的表名 t1 
    ON t.user_id = t1.user_id AND t.min_date = t1.DateUpdate
-- 关联取最后一次选择的配送日
JOIN 你的表名 t2 
    ON t.user_id = t2.user_id AND t.max_date = t2.DateUpdate
ORDER BY t.user_id;

方案2:MySQL 8.0+ 窗口函数写法(性能更优,代码更简洁)

核心用到的函数:ROW_NUMBER()、CASE WHEN、GROUP BY

SELECT 
    user_id,
    MAX(CASE WHEN rn_asc = 1 THEN Day END) AS first_day,
    MAX(CASE WHEN rn_desc = 1 THEN Day END) AS last_day
FROM (
    SELECT 
        user_id,
        Day,
        -- 每个用户的记录按更新时间正序排名
        ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY DateUpdate ASC) AS rn_asc,
        -- 每个用户的记录按更新时间倒序排名
        ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY DateUpdate DESC) AS rn_desc
    FROM 你的表名 -- 替换为实际表名
) t
WHERE rn_asc = 1 OR rn_desc = 1
GROUP BY user_id
ORDER BY user_id;

方案3:小数据量快速写法

核心用到的函数:GROUP_CONCAT()、SUBSTRING_INDEX()
注:仅适合用户变更次数少的场景,GROUP_CONCAT()默认有1024字节长度限制,变更次数多会截断数据

SELECT 
    user_id,
    SUBSTRING_INDEX(GROUP_CONCAT(Day ORDER BY DateUpdate ASC), ',', 1) AS first_day,
    SUBSTRING_INDEX(GROUP_CONCAT(Day ORDER BY DateUpdate DESC), ',', 1) AS last_day
FROM 你的表名 -- 替换为实际表名
GROUP BY user_id
ORDER BY user_id;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 07:03:02