【问题标题】:How do I make the rows of a lookup table into the columns of a query?如何将查找表的行变成查询的列?
【发布时间】:2011-10-05 22:42:45
【问题描述】:

我有三个表:students、interests 和 interest_lookup。

Students 有学生 ID 和姓名列。

Interests 具有兴趣 ID 和兴趣名称这两个列。

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。

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

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

【问题讨论】:

  • 我能想到的唯一方法是使用关键技术,但这也需要提前知道interest_name的所有值

标签: mysql sql pivot


【解决方案1】:

您正在执行称为枢轴的操作。 @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 查询的列必须在您准备查询时进行固定和硬编码

如果您在编写查询代码时不知道兴趣列表,或者您需要它来适应不断变化的兴趣列表,则必须将兴趣作为行获取并在你的申请。

【讨论】:

  • 太棒了。在您的示例之前,我无法弄清楚枢轴的真正工作原理。谢谢!我确实必须先提取所有兴趣并动态生成查询以获取所有兴趣。
  • 是的,无论哪种方式,您都需要编写代码。您可以编写代码以根据数据库中的值动态生成查询,或者您可以获取原始数据,然后编写代码来迭代结果。
【解决方案2】:

您尝试做的事情听起来像是一个支点。

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

【讨论】:

  • Pivot 不需要提前知道interest_name 的值吗?
  • 我不推荐那个巧妙的软件网站,尽管我经常看到它被引用。他们的许多查询解决方案都是完全错误的。
  • 是的,我越读那个巧妙的链接,我越开始觉得它也是不必要的混乱。
【解决方案3】:

我认为这是不可能的。其实我认为这只是数据表示的问题。我会尝试使用一个组件来显示允许我对数据进行透视的数据(例如,与您在 excel 上执行的方式相同,打开 office 的 calc 等)。

为了更进一步,您应该重新考虑为什么需要这个,并可能尝试在应用程序中而不是在数据库中解决它。

我知道这没有多大帮助,但这是我能想到的最好的了:(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2016-11-22
    相关资源
    最近更新 更多