如何将查找表的行放入查询列?

时间:2011-10-05 22:42:46

标签: mysql sql pivot

我有三个表:学生,兴趣和interest_lookup 学生们有cols student_id和名字 兴趣有cols interest_id和interest_name interest_lookup有cols student_id和interest_id

要了解学生的兴趣

select interests.interest_name from `students`
  inner join `interest_lookup`
    on interest_lookup.student_id = students.student_id
  inner join `interests`
    on interests.interest_id = interest_lookup.interest_id

我想要的是获得像

这样的结果集
student_id | students.name | interest_a | interest_b | ...

其中列名'interest_a'是interests.name和中的值 interest_列为0或1,使得值为1时 在给定的interest_lookup中有一条记录 student_id和interest_id,如果没有,则为0。

兴趣表中的每个条目都必须显示为列名。

我可以通过子选择(超级慢)或通过一堆连接来做到这一点,但这两者都需要我首先从兴趣中选择所有记录并写出动态查询。

3 个答案:

答案 0 :(得分:3)

你正在做一个名为枢轴的操作。 @ Slider345链接到(在编辑他的答案之前)另一篇关于在Microsoft SQL Server中执行此操作的SO帖子。微软有自己的特殊语法来做到这一点,但MySQL却没有。

您可以这样做:

SELECT s.student_id, s.name,
  SUM(i.name = 'a') AS interest_a,
  SUM(i.name = 'b') AS interest_b,
  SUM(i.name = 'c') AS interest_c
FROM students s
INNER JOIN interest_lookup l USING (student_id)
INNER JOIN interests i USING (interest_id)
GROUP BY s.student_id;

无法在MySQL或Microsoft或其他任何内容中执行的操作会自动填充列,以便数据的存在扩展列数。

在准备查询时,必须修复SQL查询的列

如果您在编写查询代码时不知道兴趣列表,或者需要它来适应更改的感兴趣列表,则必须将兴趣作为行获取并对这些行进行后处理你的申请。

答案 1 :(得分:1)

你尝试做什么听起来像一个支点。

大多数解决方案似乎围绕以下方法之一:

答案 2 :(得分:0)

我不认为这是可能的。实际上我认为这只是数据表示的问题。我会尝试使用一个组件来显示允许我转动数据的数据(例如,你在excel,open office's calc等方面的方式相同)。

为了更进一步,你应该再考虑为什么你需要这个,并且可能尝试在不在数据库中的应用程序中解决它。

我知道这没什么用,但这是我能想到的最好的:(