MySQL - 行到列加入语句问题

时间:2011-11-08 23:50:47

标签: php mysql

我正在尝试将一个表中的行转换为列,并使用另一个表中的行填充每个列。

保罗迪克森于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

如果您需要更多信息,请发表评论。

2 个答案:

答案 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分组(就像我在评论中说的那样)。