我已经搜索了这个问题的答案,但我还没有找到确切的方法。
我的数据库中的三个相关表是工具,目的和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
答案 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
请注意,此答案基于您的示例查询,而不是您的数据知识。如果答案没有得到您需要的结果,请发布样本数据,我应该能够修改查询以获得您想要的结果。