2011-10-05 28 views
2

我有三个表:学生,兴趣和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,使得当 在给定 student_id和interest_id中存在关于interest_lookup中的记录时,该值为1不。

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

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

+0

我可以想象的唯一方法是使用关键技术,但它也需要事先知道'interest_name'的所有值 – a1ex07

回答

3

你做称为支点的操作是最好的。@ Slider345链接到其他SO后(编辑他的答案之前)有关在Microsoft SQL Server做微软有自己特殊的语法要做到这一点,但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或者微软或者其他任何东西都会自动填充列,以便数据的存在可以扩展列的数量。

在准备查询时,SQL查询的列必须固定且硬编码为

如果您在编码查询时不知道兴趣列表,或者您需要它来适应不断变化的兴趣列表,那么您必须将兴趣作为行取回并对这些行进行后期处理在你的应用程序。

+0

太棒了。直到你的例子,我无法弄清楚数据透视是如何工作的。谢谢!我确实必须首先抽出所有的兴趣,并动态地生成查询以获得所有兴趣。 – baudtack

+0

是的,你需要编写代码。您可以编写代码来根据数据库中的值动态生成查询,否则您可以获取原始数据,然后编写代码来遍历结果。 –

1

你想要做什么听起来像一个关键。

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

+0

不需要提前知道interest_name的值吗? – baudtack

+2

我不推荐那些巧妙的软件网站,尽管我经常引用它。他们的许多查询解决方案都是错误的。 –

+0

是的,我读得越多,我越是开始觉得这是不必要的混淆。 – Slider345

0

我不认为这是poss IBLE。其实我认为这只是一个数据表示的问题。我会尝试使用一个组件来显示允许我转换数据的数据(例如,您对excel,open office的calc等进行的处理方式相同)。

更进一步,你应该再想一想为什么你需要这个,可能试图在应用程序中解决它而不是数据库中。

我知道这并没有太大的帮助,但它是我能想到的:(

相关问题