我做过几份工作,经常看到这样的数据库:
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_name
和 last_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/