我有三个表:学生、兴趣和interest_lookup。
学生的列名为 Student_id 和姓名。
兴趣有兴趣_id 和兴趣_名称列。
Interest_lookup 具有学生 ID 和兴趣 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。
兴趣表中的每个条目都必须显示为列名称。
我可以通过子选择(速度非常慢)或进行一堆连接来完成此操作,但这两者都需要我首先从兴趣中选择所有记录并编写动态查询。
最佳答案
您正在执行一项称为枢轴的操作。 @Slider345 链接到(在编辑他的答案之前)另一篇关于在 Microsoft SQL Server 中执行此操作的 SO 帖子。 Microsoft 有自己的特殊语法来执行此操作,但 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 查询的列进行固定和硬编码。
如果您在编写查询代码时不知道兴趣列表,或者您需要它来适应不断变化的兴趣列表,则必须将兴趣作为行获取,并在以下位置对这些行进行后处理:您的应用程序。
关于mysql - 如何将查找表的行变成查询的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7668612/