mysql - SQL - 选择值成为列值?

标签 mysql sql

我做过几份工作,经常看到这样的数据库:

            Column_Values
            +------+--------------+--------------+
            |  id  |   field_id   |    label     |
            +------------------------------------+
            |  1   |  first_name  |  First Name  +-----------------+
            |  2   |  last_name   |  Last Name   +-----------------------+
            |      |              |              |                 |     |
            |      |              |              |                 |     |
            |      |              |              |                 |     |
            +------+--------------+--------------+                 |     |
                                                                   |     |
            User Row                                               |     |
            +-------+                                              |     |
            |  id   |                                              |     |
            +-------+                                              |     |
+-----------+ 9000  |                                              |     |
|           | 10000 |                                              |     |
|           |       |                                              |     |
|           |       |                                              |     |
|           |       |                                              |     |
|           +-------+                                              |     |
|                                                                  |     |
|           Mapping Table                                          |     |
|           +------------+-------------+---------+                 |     |
|           |  User_Id   |  Field ID   |  Value  |                 |     |
|           +------------------------------------+                 |     |
+----------->    9000    |     1       |  John   <-----------------+     |
            |    9000    |     2       |   Doe   <-----------------------+
            +------------+-------------+---------+

实际上并没有一个包含 first_namelast_name 的列,列的名称实际上存储在另一个表中。

我如何选择用户,以便我得到类似的东西?

+---------+-------------+-----------+
| User_ID | First Name  | Last Name |
+-----------------------------------+
| 9000    |  John       |   Doe     |
|         |             |           |
+---------+-------------+-----------+

这种类型的数据库还有名字吗?这背后的逻辑似乎是拥有动态列,但我认为可以通过计划停机时间更新表格来缓解这个问题。

最佳答案

条件聚合应该可以解决问题:

SELECT
    u.id,
    MAX(CASE WHEN cv.field_id = 'first_name' THEN m.value END) first_name,
    MAX(CASE WHEN cv.field_id = 'last_name' THEN m.value END) last_name
FROM user u
INNER JOIN mapping m ON m.user_id = u.id 
INNER JOIN Column_Values cv ON cv.id = m.field_id
GROUP BY u.id

注意:如果您只需要用户 ID 及其名字和姓氏,则无需引入 user 表。只是:

SELECT
    m.user_id,
    MAX(CASE WHEN cv.field_id = 'first_name' THEN m.value END) first_name,
    MAX(CASE WHEN cv.field_id = 'last_name' THEN m.value END) last_name
FROM mapping m ON 
INNER JOIN Column_Values cv ON cv.id = m.field_id
GROUP BY m.user_id

关于mysql - SQL - 选择值成为列值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55111264/

相关文章:

mysql - 如何改进键表和另一个表之间的 JOIN 操作

sql - 甲骨文 11g : How to union an oracle table with itself?

sql - 如何编辑 SQL Server 主数据库文件 .mdf

Mysql语句选择以特定字符范围开头的名称

mysql - 在mysql的 View 中执行sql命令

mysql - 在sql中获取与嵌套类别相关的项目数

MySQL 查询查找第二个子表条目不匹配的子记录

mysql - S.no 的 SQL 查询

php - mysql无缓冲查询锁定不锁定

mysql - SQL 查询语法错误 : unexpected 'SUM' (sum)