1

我已经搜索了很多这个问题的答案,但我还没有找到确切的方法。

我的数据库中的三个相关表是工具、用途和 user_tools。Tool 和 purpose 都有 id 和 description 列,而 user_tools 有 user_id、tool_id 和 purpose_id 列。工具和用途本质上是静态查找表,并且 user_tools 对于给定用户使用工具的每个用途都有一行。

我需要构建一个 SELECT 语句,其列是用途表中列出的每个不同用途的工具描述和使用计数。例如。结果行:

description | Purpose: Class | Purpose: Student Club | Purpose: Personal Project | ...

'Lathe'     |  100           |   50                  |     11                    | ... 

我想这样做,而不必将 purpose_id 硬编码到 SELECT 中,这样如果我想向目的表添加新条目,我就不需要更改我的代码。

以下语句获取我想要的信息,但它为每个不同的目的计数创建一个新行,我希望将它们全部放在列中。

SELECT 
  tool.description, 
  count(purpose.id), 
  purpose.description 
FROM 
  user_tools LEFT OUTER JOIN tool 
ON 
  user_tools.tool_id = tool.id LEFT OUTER JOIN purpose 
ON 
  user_tools.purpose_id = purpose.id 
GROUP BY 
  tool.description, 
  purpose.description
4

1 回答 1

0

如果没有编写使用动态 SQL 的过程,您将不得不硬编码目的 ID,因为您不能在查询中拥有不同数量的结果列。

您需要的是 PIVOT 操作。以下是它在 MySQL 中的实现方式:

SELECT
  tool.description,
  COUNT(CASE WHEN purpose.id = <ID for Class> THEN 1 END) AS `Purpose: Class`,
  COUNT(CASE WHEN purpose.id = <ID for Student Club> THEN 1 END) AS `Purpose: Student Club`,
  . . . and the rest of the purpose.id values
FROM user_tools
LEFT JOIN tool ON user_tools.tool_id = tool.id
LEFT JOIN purpose ON user_tools.purpose_id = purpose_id
GROUP BY tool.description

请注意,此答案基于您的示例查询,而不是您对数据的任何了解。如果答案没有得到您需要的结果,请发布示例数据,我应该能够修改查询以获得您想要的结果。

于 2013-08-14T15:44:02.557 回答