2011-05-13 88 views
3

在过去的几天里,我一直在试图找到这个问题的答案。虽然我还没有找到答案,但本网站仍然出现在我的搜索结果中,所以我想我会试一试。令人敬畏的格式选项的帖子顺便说一句。MySQL数据透视表

我有这样一个表:

user_id | form_id | question_id | data_label | data_value 
1   1   1    firstName Joe 
1   1   2    lastName  Smith 
1   1   3    phone  5554443333 
2   1   1    firstName Sally 
2   1   2    lastName  Jones 
2   1   3    phone  3334445555 

,我想变成:

user_id | firstName | lastName | phone 
1   Joe   Smith  5554443333 
2   Sally  Jones  3334445555 

我能找到的例子如何做到这一点。我不太了解他们,但他们在那里。当这个单一表格保存从任何可能数量的字段以各种形式输入的数据时,我的独特问题就会生效。所以,我可能有一个表:

user_id | form_id | question_id | data_label | data_value 
1   1   1    firstName Joe 
1   1   2    lastName  Smith 
1   1   3    phone  5554443333 
2   1   1    firstName Sally 
2   1   2    lastName  Jones 
2   1   3    phone  3334445555 
3   2   1    fav_color red 
3   2   2    fav_animal eagle 
4   2   1    fav_color blue 
4   2   2    fav_animal dog 

然后我会把在form_id作为参数,从形式由用户(他们都应该有不同的值相同的标签)分组收集所有记录,然后显示该数据为:

... form_id = 1的报告看起来像时:

user_id | firstName | lastName | phone 
1   Joe   Smith  5554443333 
2   Sally  Jones  3334445555 

...当form_id = 2的报告如下所示:

user_id | fav_color | fav_animal 
3   red   eagle 
4   blue  dog 

我是高级SQL编程和程序的新手,我无法弄清楚如何自己完成此操作。我需要查询能够处理任何数字/类型的字段,而不必在每个表单的查询中输入完全可能的字段名称。请注意,上面的第一个查询有四个字段,而第二个查询有三个。所以解决方案需要以这种方式灵活。

SQL也可以通过编程语言生成,因此如果有帮助,该解决方案还有更多选项。

如果您没有足够的信息,请通知我。

回答

3

你可以尝试(未经测试)类似

select form_id, 
max(case data_label when 'lastName' then data_value else null end) as lastname, 
max(case data_label when 'firstName' then data_value else null end) as firstname, 
max(case data_label when 'phone' then data_value else null end) as phone 
from mytable 
group by form_id 
+0

谢谢您的答复。我不敢相信直到现在我还没有看到,但由于我可以通过编程方式创建SQL语句,所以我可以先查询字段名称的数据,然后动态创建您为每种类型的表单提供的SQL语句。我对上述声明做的唯一更改是将“group by form_id”更改为“group by user_id”,这样我就可以获得每个用户的响应,而不是该表单的第一个响应。再次感谢你的帮助! –