Mysql 合并和展平表的SQL

Mysql 合并和展平表的SQL,mysql,sql,join,flatten,Mysql,Sql,Join,Flatten,在MySQL中,我有三个表: 用户: USER_ID | USERNAME 1 | Homer Simpson 字段: FIELD_ID | FIELD_NAME 1 | Phone 2 | Address 字段值: USER_ID | FIELD_ID | FIELD_VALUE 1 | 1 | 555-1212 1 | 2 | 10 biteme drive 我想做的是合并这三个表,这样每个用户

在MySQL中,我有三个表:

用户:

USER_ID | USERNAME
1       | Homer Simpson
字段:

FIELD_ID | FIELD_NAME
1        | Phone
2        | Address
字段值:

USER_ID | FIELD_ID | FIELD_VALUE
1       | 1        | 555-1212
1       | 2        | 10 biteme drive
我想做的是合并这三个表,这样每个用户就有一行,字段名作为列标题和字段值,这样我就有了:

用户列表:

USER_ID  | USER_NAME     | PHONE    | ADDRESS
1        | Homer Simpson | 555-1212 | 10 biteme drive

如果字段名phone和address是固定的,您可以使用以下技巧来透视数据:

SELECT
  users.user_id,
  users.user_name,
  MAX(CASE WHEN field_id=1 THEN field_value END) AS Phone,
  MAX(CASE WHEN field_id=2 THEN field_value END) AS Address
FROM
  users INNER JOIN field_values
  ON users.user_id = field_values.user_id
GROUP BY
  users.user_id,
  users.user_name
但如果您的值不固定,则需要使用动态查询:

SELECT    
  CONCAT(    
    'SELECT users.user_id,users.username,',    
    GROUP_CONCAT(CONCAT('MAX(CASE WHEN field_id=', field_id, ' THEN field_value END) AS `', field_name, '`')),    
    ' FROM users INNER JOIN field_values ON users.user_id = field_values.user_id',
    ' GROUP BY users.user_id, users.username')    
FROM `fields` INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
请参阅fiddle。

尝试以下操作:- 选择 users.user\u id、用户名、fv1.field\u值1、innertab.field\u值2 从…起 用户左连接字段_值fv1 在users.user\u id=fv1.user\u id上 内部联接字段f1 在fv1.FIELD_ID=f1.FIELD_ID和f1.FIELD_ID=1上 左连接 选择 users.user\u id,FIELD\u value.FIELD\u value 从…起 用户左连接字段值 ON users.user\U id=字段\U VALUES.user\U id 内部联接字段 将FIELD\u VALUES.FIELD\u ID=FIELDS.FIELD\u ID和FIELDS.FIELD\u ID=2作为 innertab.user\u id=users.user\u id