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

MySQL存储过程实现行转列并关联用户表查询

MySQL带输入参数的存储过程实现方案

直接给你能满足需求的简洁实现,解决行转列时的null问题,同时关联用户表过滤无匹配的记录:

DELIMITER //

CREATE PROCEDURE GetMetaDataByProperty3(IN p_property3 VARCHAR(255))
BEGIN
    SELECT 
        md.id,
        MAX(CASE WHEN md.`key` = 'property_1' THEN md.value END) AS property_1,
        MAX(CASE WHEN md.`key` = 'property_2' THEN md.value END) AS property_2,
        MAX(CASE WHEN md.`key` = 'property_3' THEN md.value END) AS property_3,
        u.email
    FROM meta_data md
    -- 先筛选出符合property_3参数条件的id集合
    INNER JOIN (
        SELECT id FROM meta_data WHERE `key` = 'property_3' AND value = p_property3
    ) filtered_ids ON md.id = filtered_ids.id
    -- 关联users表,仅保留有匹配email的记录
    INNER JOIN users u ON md.id = u.id
    GROUP BY md.id, u.email;
END //

DELIMITER ;

关键说明:

  • 行转列逻辑:用MAX(CASE ...)组合实现行转列,聚合函数MAX能确保分组后每个property只取对应的值,避免出现null(如果某个id下缺少某个property,会返回null,若要替换为默认值可改用COALESCE(MAX(...), ''))
  • 筛选条件:通过子查询filtered_ids先锁定符合输入参数的id,减少后续关联和聚合的数据量
  • 用户表关联:使用INNER JOIN自动过滤掉没有匹配email的id,符合“未匹配到则不执行”的要求

你之前用CASE WHEN出现null,核心原因是没配合聚合函数(MAX/MIN等)做分组处理,单纯的CASE WHEN在分组后没有聚合会无法正确合并同id的多行数据,最终出现null值。

内容的提问来源于stack exchange,提问作者awp-sirius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:22:22