2017-01-18 30 views
4

我有一個表結構如下所述:加入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 JOIN,但這不起作用。

我可以製作一個PHP腳本來生成SQL,但是必須有辦法讓查詢動態工作。

+2

@Prdp的最後一句他的回答是最好的方法。閱讀[數據規範化](https://en.wikipedia.org/wiki/Database_normalization)瞭解爲什麼以及何時將列拆分到不同的表。 – davejal

+0

SELECT * .values,key.keys,name.persons FROM值 LEFT JOIN鍵 ON values.key_id = keys.id LEFT JOIN你是怎麼解決這個問題的人 ON values.person_id = persons.id – user1544541

+0

?我有類似的情況:https://stackoverflow.com/questions/44445013/pdo-normalizing-mysql-tables?noredirect=1#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 

擺脫KeysValues表和Person表中添加兩列名爲AgeGender本身

+0

謝謝,但是這仍然不是完全動態的解決方案。原因我有單獨鍵和值的表是因爲它用於生成表單,並且用戶必須能夠添加新的鍵。這是簡化的,我實際上有兩個其他列的鍵,一個用於類型和一個可能的值。如果類型是「下拉式」,則可能的值必須位於另一列中 – Kari