我正在尝试将一个表中的行转换为列,并使用另一个表中的行填充每个列。
保罗迪克森于2009年3月16日10:23在这篇文章中的回答似乎与我想要实现的非常接近。我在下面发布了他的答案中的相关部分。 How to pivot a MySQL entity-attribute-value schema
SELECT file.*,
attr1.value AS 'Attribute 1 Name',
attr2.value AS 'Attribute 2 Name',
...
FROM
file
LEFT JOIN attr AS attr1
ON(file.FileId=attr1.FileId and attr1.AttributeId=1)
LEFT JOIN attr AS attr2
ON(file.FileId=attr2.FileId and attr2.AttributeId=2)
...
我为上面的示例创建了一个类似的查询:
SELECT
forms.*,
tbl_1.*,
tbl_2.*,
tbl_1.value as FirstName,
tbl_2.value as LastName
FROM t_form_fields as forms
LEFT JOIN t_player_data as tbl_1
ON(forms.id=tbl_1.form_field_id and tbl_1.form_field_id = 2)
LEFT JOIN t_player_data as tbl_2
ON(forms.id=tbl_2.form_field_id and tbl_2.form_field_id = 3)
运行此查询的当前结果是:
form_field_id name player_id value player_id value FirstName LastName
2 First Name 1 Bob NULL NULL Bob NULL
2 First Name 2 Bill NULL NULL Bill NULL
2 First Name 3 Zech NULL NULL Zech NULL
2 First Name 4 Tim NULL NULL Tim NULL
3 Last Name NULL NULL 1 Goodman NULL Goodman
3 Last Name NULL NULL 2 Herbst NULL Herbst
3 Last Name NULL NULL 3 CampbellNULL Campbell
3 Last Name NULL NULL 4 Smith NULL Smith
期望的结果是:
player_id FirstName LastName
1 Bob Goodman
2 Bill Herbst
3 Zech Campbell
4 Tim Smith
如果您需要更多信息,请发表评论。
答案 0 :(得分:1)
SELECT file.*,
MAX(attr1.value) AS 'Attribute 1 Name',
MAX(attr2.value) AS 'Attribute 2 Name',
...
FROM
file
LEFT JOIN attr AS attr1
ON(file.FileId=attr1.FileId and attr1.AttributeId=1)
LEFT JOIN attr AS attr2
ON(file.FileId=attr2.FileId and attr2.AttributeId=2)
...
GROUP BY file.player_id
您是否期望丢失属性?否则,您不需要 LEFT JOIN。
另一种仅使用一个连接将表旋转到属性表的方法是:
SELECT file.*,
MAX(IF(attr.AttributeId = 1, attr.value, NULL)) AS 'Attribute 1 Name',
MAX(IF(attr.AttributeId = 2, attr.value, NULL)) AS 'Attribute 2 Name',
...
FROM
file
LEFT JOIN attr ON(file.FileId=attr.FileId)
...
GROUP BY file.player_id
请注意IF()
函数语法是特定于MySQL的,需要将其重写为CASE
块以供其他DBMS使用。
答案 1 :(得分:1)
按玩家_id分组(就像我在评论中说的那样)。