SQL - Выберите значения, чтобы стать значениями столбцов? - PullRequest
1 голос
/ 12 марта 2019

Я выполнил несколько заданий, и я часто вижу такие базы данных:

            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     |
|         |             |           |
+---------+-------------+-----------+

Также есть имя для этого типа базы данных? Кажется, логика заключается в том, чтобы иметь динамические столбцы, однако я думаю, что эту проблему можно решить запланированным временем простоя для обновления таблиц.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Попробуйте

1002 *
1 голос
/ 12 марта 2019

Условное агрегирование должно сработать:

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

Примечание: если вам нужен только идентификатор пользователя, его имя и фамилия, вам не нужно вносить таблицу 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...