2017-01-18 8 views
4

I имеют структуру таблицы, как описано ниже:Объединение таблиц 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 | 
+-----------+------+--------+-----+ 

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

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

+2

Последнее предложение @Prdp его ответ лучший путь , Ознакомьтесь с [нормализацией данных] (https://en.wikipedia.org/wiki/Database_normalization), чтобы понять, почему и когда вы разделяете столбцы на разные таблицы. – davejal

+0

SELECT * .values, key.keys, name.persons ИЗ значений LEFT JOIN ключи НА values.key_id = keys.id LEFT JOIN лиц НА values.person_id = persons.id – user1544541

+0

Как вы решить эту проблему? У меня такая же ситуация: https://stackoverflow.com/questions/44445013/pdo-normalizing-mysql-tables?noredirect1_comment75888296_44445013 – user1286956

ответ

4

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 таблице сама

+0

Спасибо, однако это все еще не полностью динамическое решение. Причина, по которой у меня есть отдельный таблицы для ключей и значений - это потому, что они используются для создания формы, и пользователь должен иметь возможность добавлять новые ключи. Это упрощено, на самом деле у меня есть два других столбца в ключах: один для типа и один для возможных значений. Если тип «выпадающий», то возможные значения должны быть в другом столбце – Kari