Triple Inner Join保留标题

时间:2014-04-29 09:26:14

标签: mysql sql

美好的一天!

我有以下三个表格(功能,人物和数据)

表格功能

---------------------------
| featureId | featureName |
---------------------------
|     1     |   Weight    |
|     2     |     Age     |
|     3     |    Height   |
---------------------------

表人

---------------------------
|  personId | personName  |
---------------------------
|     1     |    John     |
|     2     |     Doe     |
|     3     |    Mark     |
---------------------------

表数据 (pId = personId fId = featureId)

--------------------------
| id  | pId | fId | value |
--------------------------
|  1  |  1  |  1  |  80   |
|  2  |  1  |  2  |  28   |
|  3  |  1  |  3  |  175  |
|  4  |  2  |  1  |  70   |
|  5  |  2  |  2  |  22   |
|  6  |  2  |  3  |  168  |
|  7  |  3  |  1  |  100  |
|  8  |  3  |  2  |  44   |
|  9  |  3  |  3  |  180  |
--------------------------

我知道第三张桌子是一场噩梦,但这就是我所拥有的。 是否可以构建一个返回的查询(包含在PHP中使用的标题)

--------------------------------
| Name | Weight | Age | Height |
--------------------------------
| John |  80    |  28 |  175   |
| Doe  |  70    |  22 |  168   |
| Mark |  100   |  44 |  180   |
--------------------------------

看起来像一个三重内连接,但标题使它更复杂,我无法弄明白 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您可以在CASE功能

中加入表格和MAX来完成此操作
SELECT
p.personName
,MAX(CASE WHEN f.featureName='Weight' THEN d.value END) Weight
,MAX(CASE WHEN f.featureName='Age' THEN d.value END) Age
,MAX(CASE WHEN f.featureName='Height' THEN d.value END) Height
FROM people p
LEFT JOIN data d ON(p.personId=d.pId)
LEFT JOIN features f ON(f.featureId=d.fId)
GROUP BY d.pId

Fiddle Demo