mysql根据条件显示分组列

时间:2013-10-10 07:26:23

标签: mysql sql database

我正在处理一个查询,需要在列中输出用户的“总体约定”,例如1 -eng列将显示具有一个约定的用户,第二列2-eng将显示已完成2次约定的用户。同样3eng,依此类推。请注意,显示应该是这样的。我有一个具有userID的订婚表。所以我得到了像这样的不同用户

select count(distinct userID) from engagements 

我接受了

select count(*) from engagements 

此处的参与是指喜欢,回复或分享内容的用户

请帮忙。谢谢!我使用过CASE和IF但无法以下面的形式显示

1eng             2eng          3eng 

100              200           100

1 个答案:

答案 0 :(得分:0)

考虑在行中返回结果,然后在应用程序中将其旋转。

要在行中返回所需的结果,可以使用以下查询:

SELECT
  engagementCount,
  COUNT(*) AS userCount
FROM (
  SELECT
    userID,
    COUNT(*) AS engagementCount
  FROM engagements
  GROUP BY userID
) AS s
GROUP BY engagementCount
;

基本上,您首先按engagementsuserID行进行分组,然后获得每userID行数。之后,您将计数用作分组标准,并计算找到该计数的用户数。

如果您坚持在SQL中返回柱状视图,则需要使用动态SQL,因为最终结果集中的列数不确定。您可能需要临时存储内部SELECT的结果,扫描它以构建每个engagementCount值的计数表达式列表,并最终构造此类查询:

SELECT
  COUNT(engagementCount = 1 OR NULL) AS `1eng`,
  COUNT(engagementCount = 2 OR NULL) AS `2eng`,
  COUNT(engagementCount = 3 OR NULL) AS `3eng`,
  ...
FROM temporary_storage
;

SUM(engagementCount = value)代替COUNT(engagementCount = value OR NULL)。 (对我来说,后者更明确地表达了意图,因此我首先建议它,但是,如果你碰巧更喜欢SUM技术,那么两者之间的表现应该没有明显差异。解释OR NULL技巧here。)