在 MySQL 中,我有三个表,如下所示:
用户:
USER_ID | USERNAME
1 | Homer Simpson
字段:
FIELD_ID | FIELD_NAME
1 | Phone
2 | Address
FIELD_VALUES:
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
最佳答案
如果字段名称(电话和地址)是固定的,您可以使用此技巧来透视数据:
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 here .
关于mysql - 用于合并和展平表的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20846828/