Соединение таблиц MySQL с парами ключ-значение

У меня есть структура таблицы, как описано ниже:

persons
+----+------+
| id | name |
+----+------+
| 1  | Bart |
| 2  | Lisa |
+----+------+

keys
+----+--------+
| id | key    |
+----+--------+
| 1  | gender |
| 2  | age    |
+----+--------+

values
+----+-----------+--------+--------+
| id | person_id | key_id | value  |
+----+-----------+--------+--------+
| 1  | 1         | 1      | male   |
| 2  | 1         | 2      | 10     |
| 3  | 2         | 1      | female |
| 4  | 2         | 2      | 8      |
+----+-----------+--------+--------+

И мне нужно было бы получить таблицу в следующем виде:

+-----------+------+--------+-----+
| person_id | name | gender | age |
+-----------+------+--------+-----+
| 1         | Bart | male   | 10  |
| 2         | Lisa | female | 8   |
+-----------+------+--------+-----+

Я могу достичь этого, используя левое соединение, но это не работает динамически.

Я мог бы сделать скрипт PHP, который бы генерировал SQL, но должен быть способ сделать запрос, который работает динамически.

5

Решение

Conditional Aggregation + Join

SELECT p.person_id,
p.NAME,
Max(CASE WHEN key_id = 1 THEN value END) AS Gender,
Max(CASE WHEN key_id = 2 THEN value END) AS Age
FROM   VALUES v
JOIN person p
ON v.person_id = p.id
GROUP  BY p.person_id,
p.NAME

Избавляться от Keys а также Values таблица и добавить два столбца под названием Age а также Gender в Person сам стол

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector