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
相关产品推荐
相关产品推荐

