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

获取基于status列的唯一emailId的MySQL查询方案

需求说明

现有MySQL表数据如下:

emailIdstatus
aa@gmail.comreject
aa@gmail.comcomplete
aa@gmail.comprogress
bb@gmail.comcomplete
bb@gmail.comprogress
cc@gmail.comprogress
cc@gmail.comreject
dd@gmail.comprogress
dd@gmail.comcomplete
ee@gmail.comreject
ff@gmail.comprogress

需要为每个唯一emailId返回一个status,优先级规则为 complete > progress > reject,预期结果如下:

emailIdstatus
aa@gmail.comcomplete
bb@gmail.comcomplete
cc@gmail.comprogress
dd@gmail.comcomplete
ee@gmail.comreject
ff@gmail.comprogress
解决方案

以下是两种满足需求的MySQL查询语句,可根据你的MySQL版本选择使用:

方法1:兼容MySQL 5.x及以上版本

通过CASE表达式给状态分配优先级权重,结合聚合函数筛选最高优先级状态:

SELECT 
    emailId,
    CASE MAX(CASE status
        WHEN 'complete' THEN 3
        WHEN 'progress' THEN 2
        WHEN 'reject' THEN 1
        ELSE 0
    END)
        WHEN 3 THEN 'complete'
        WHEN 2 THEN 'progress'
        WHEN 1 THEN 'reject'
        ELSE NULL
    END AS status
FROM your_table_name
GROUP BY emailId;

方法2:适用于MySQL 8.0及以上版本

利用窗口函数ROW_NUMBER()按优先级排序,直接筛选每个emailId的第一条记录:

SELECT t.emailId, t.status
FROM (
    SELECT 
        emailId, 
        status,
        ROW_NUMBER() OVER (
            PARTITION BY emailId 
            ORDER BY 
                CASE status
                    WHEN 'complete' THEN 1
                    WHEN 'progress' THEN 2
                    WHEN 'reject' THEN 3
                END
        ) AS rn
    FROM your_table_name
) t
WHERE t.rn = 1;

注意事项

  • 请将语句中的your_table_name替换为实际的表名。
  • 方法1通过权重值的最大值反向映射回状态,兼容性更强;方法2逻辑更直观,适合支持窗口函数的高版本MySQL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:20:04