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

MySQL中基于CASE WHEN逻辑实现用户数据唯一行返回

优化SQL实现用户唯一行输出

原SQL因左连接关联多字段记录导致同一用户出现多行,以下几种方案可实现每个user_id仅返回一行的需求:

方案一:GROUP BY 结合聚合判断

通过分组聚合判断用户是否存在field_id=1的记录:

SELECT 
    uc.user_id, 
    uc.c_id,
    CASE 
        WHEN MAX(CASE WHEN ucf.field_id = 1 THEN 1 ELSE 0 END) = 1 THEN '1'
        ELSE 'Not given'
    END AS field
FROM user_company uc
LEFT JOIN user_company_field ucf ON uc.user_id = ucf.user_id
GROUP BY uc.user_id, uc.c_id;

逻辑:将同一user_id和c_id的记录分组,用MAX函数判断分组内是否存在field_id=1的记录,存在则返回'1',否则返回'Not given'。

方案二:EXISTS 子查询(推荐)

直接通过存在性判断替代表连接,性能更优且天然保证单行:

SELECT 
    uc.user_id, 
    uc.c_id,
    CASE 
        WHEN EXISTS (SELECT 1 FROM user_company_field ucf WHERE ucf.user_id = uc.user_id AND ucf.field_id = 1) THEN '1'
        ELSE 'Not given'
    END AS field
FROM user_company uc;

逻辑:对每个用户,检查user_company_field表中是否存在匹配user_id且field_id=1的记录,根据结果返回对应值,无需处理多余的连接数据。

方案三:左连接限定字段 + DISTINCT

仅关联field_id=1的记录,再去重确保单行:

SELECT DISTINCT
    uc.user_id, 
    uc.c_id,
    CASE 
        WHEN ucf.field_id = 1 THEN '1'
        ELSE 'Not given'
    END AS field
FROM user_company uc
LEFT JOIN user_company_field ucf ON uc.user_id = ucf.user_id AND ucf.field_id = 1;

逻辑:左连接时仅匹配field_id=1的记录,用户有该记录则返回'1',无则返回'Not given',DISTINCT用于处理user_company表中可能存在的重复user_id和c_id记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:46:01