Mysql 合并和展平表的SQL
在MySQL中,我有三个表: 用户: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 我想做的是合并这三个表,这样每个用户
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