使用键值对连接MySQL表

Kar*_*ari 6 php mysql sql key aggregate-functions

我有一个如下所述的表结构:

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      |
+----+-----------+--------+--------+
Run Code Online (Sandbox Code Playgroud)

我需要得到一个像这样的表:

+-----------+------+--------+-----+
| person_id | name | gender | age |
+-----------+------+--------+-----+
| 1         | Bart | male   | 10  |
| 2         | Lisa | female | 8   |
+-----------+------+--------+-----+
Run Code Online (Sandbox Code Playgroud)

我可以通过使用LEFT JOIN来实现这一点,但这不能动态地工作.

我可以创建一个生成SQL的PHP​​脚本,但必须有办法让查询动态起作用.

Pரத*_*ீப் 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 
Run Code Online (Sandbox Code Playgroud)

摆脱KeysValues表并添加两列名为AgeGenderPerson表本身

  • 谢谢,但是这仍然不是完全动态的解决方案。我有单独的键和值表的原因是因为它用于生成表单,并且用户必须能够添加新键。这是简化的,我实际上在键中还有另外两列,一列用于类型,另一列用于可能的值。如果类型为“下拉”,则可能的值必须在另一列中 (2认同)