获取基于status列的唯一emailId的MySQL查询方案
需求说明
现有MySQL表数据如下:
| emailId | status |
|---|---|
| aa@gmail.com | reject |
| aa@gmail.com | complete |
| aa@gmail.com | progress |
| bb@gmail.com | complete |
| bb@gmail.com | progress |
| cc@gmail.com | progress |
| cc@gmail.com | reject |
| dd@gmail.com | progress |
| dd@gmail.com | complete |
| ee@gmail.com | reject |
| ff@gmail.com | progress |
需要为每个唯一emailId返回一个status,优先级规则为 complete > progress > reject,预期结果如下:
| emailId | status |
|---|---|
| aa@gmail.com | complete |
| bb@gmail.com | complete |
| cc@gmail.com | progress |
| dd@gmail.com | complete |
| ee@gmail.com | reject |
| ff@gmail.com | progress |
解决方案
以下是两种满足需求的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
相关产品推荐
相关产品推荐

