mysql - 如何将查找表的行变成查询的列?

标签 mysql sql pivot

我有三个表:学生、兴趣和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/

相关文章:

php - 尝试在 Console.log 中获取非对象的属性

mysql - 在 Apache Phoenix 中聚合和分组

php - 我想使用数字 0-9 作为 mysql 表名。我应该如何使用 `` 反引号编写 sql 查询以防止 sql 查询错误?

php - mysql 日期查询得到错误答案

mysql - 您不能在 FROM 子句中指定要更新的目标表 'A'

sql - 在 sql 中选择不同名称和计数名称的查询

sql - PostgreSQL 中的数据透视表

java - 使用 JDBC Statement 或PreparedStatement 执行一组查询

php mysql multi upade 和内部服务器错误

mysql - 将数据列转换为 mySQl 中的行