MySQL多表查询行转列:将同一用户多行数据合并为单行
问题描述
关联3张表查询后,同一用户会返回4行数据——仅meta_key和meta_value两列不同,其余字段完全一致。需要将这4行合并为1行,把不同行的meta_key对应的值转为单独的列,而非分散在多行中。
当前使用的查询语句:
SELECT CONCAT( 'https://example.com/?search=', comment_content ) AS link, wp_comments.user_id, user_email, user_login, user_nicename, comment_date as 'Interview Date', display_name, user_registered, meta_key, meta_value
解决方案
可以用条件聚合实现行转列,通过CASE WHEN判断meta_key的值,将对应的meta_value提取为单独列,再配合GROUP BY分组合并同一用户的行。
假设你的4个meta_key分别是field_a、field_b、field_c、field_d,修改后的查询语句如下(请替换为实际的meta_key值):
SELECT CONCAT('https://example.com/?search=', comment_content) AS link, wp_comments.user_id, user_email, user_login, user_nicename, comment_date AS 'Interview Date', display_name, user_registered, -- 按实际meta_key替换以下字段 MAX(CASE WHEN meta_key = 'field_a' THEN meta_value END) AS field_a, MAX(CASE WHEN meta_key = 'field_b' THEN meta_value END) AS field_b, MAX(CASE WHEN meta_key = 'field_c' THEN meta_value END) AS field_c, MAX(CASE WHEN meta_key = 'field_d' THEN meta_value END) AS field_d FROM -- 补充你关联3张表的JOIN语句,示例: wp_comments JOIN wp_users ON wp_comments.user_id = wp_users.ID JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id GROUP BY link, wp_comments.user_id, user_email, user_login, user_nicename, comment_date, display_name, user_registered;
说明
CASE WHEN匹配对应meta_key并提取值,MAX()用于分组后保留有效数据(同一用户对应meta_key只有一条有效记录,其余为NULL,聚合函数会过滤NULL)。GROUP BY需包含所有非聚合字段(即原查询中除meta_key、meta_value外的所有字段)。- 若数据库支持
PIVOT语法,也可使用该方式实现,但条件聚合是适配大多数数据库(MySQL、PostgreSQL、SQLite等)的通用写法。
内容的提问来源于stack exchange,提问作者Cyberian
相关产品推荐
相关产品推荐

