mysql - 用于合并和展平表的 SQL

标签 mysql sql join flatten

在 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/

相关文章:

javascript - 鼠标悬停时在固定位置显示图像

mysql - 在脚本 mysql 中重置自动递增列值

mysql - Windows 10如何只安装MySQL客户端?

mysql - MySQL SP 中的更新语句显示缺少结束错误

sql - 如何在 Kohana 3 中配置 SQLite?

mysql - 如何获取 SQL 中的最新行?

SQL按时间间隔查询

MySQL:按第二个表中的值排序,如果未设置值,则使用默认值

MySQL 棘手的双重/三重 JOIN(?)

php - MYSQL/PHP : Concat returning to many fields on LEFT JOIN