MYSQL选择在另一个表中发生的多个ID的计数

时间:2013-08-14 15:34:21

标签: mysql sql relational-database

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

我的数据库中的三个相关表是工具,目的和user_tools。工具和目的都有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

1 个答案:

答案 0 :(得分: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

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