【问题标题】:Difference between two COUNTS两个计数之间的差异
【发布时间】:2013-07-22 17:01:08
【问题描述】:

我有一个 mysql 表 private_messages (pm),如下所示:

用户名 --- 发件人 --- 文本

虽然 Userid 和 Sender 都是表 user 中的 ID。 现在我想做一个查询,其中用户获取他发送给另一个用户的 pms 数量与从这个用户收到的 pms 之间的差异 - 按Userid 分组 所以我想把这两个查询合二为一,从中得到不同:

SELECT count(*) AS s_count, sender FROM pm WHERE userid=".$userid" GROUP BY sender
SELECT count(*) AS u_count, userid FROM pm WHERE sender=".$userid." GROUP BY userid

现在我想要在所有匹配的用户 ID 上区分s_countu_count

【问题讨论】:

标签: php mysql count


【解决方案1】:

如果你想统计你所通信的每个用户,你可以使用UNION ALL收集所有消息并将它们汇总到一个外部查询中;

SELECT counterpart, SUM(sent) sent, SUM(received) received,
       SUM(sent) - SUM(received) difference
FROM (
  SELECT 1 sent, 0 received, userid counterpart 
  FROM messages WHERE sender = <your user id>
  UNION ALL
  SELECT 0 sent, 1 received, sender counterpart
  FROM messages WHERE userid = <your user id>
) a
GROUP BY counterpart;

An SQLfiddle to test with.

【讨论】:

  • 谢谢,这很好用!你能告诉我如何添加一个 where 子句以便它只选择差异 > 0 的行吗?
  • @TobiasBaumeister 您可以在查询末尾的GROUP BY 行之后添加HAVING SUM(sent) &lt;&gt; SUM(received)
【解决方案2】:

明智的做法是将结果分组所在的任何列添加到选择列表中:

SELECT sender, COUNT(*) AS s_count FROM pm WHERE userid = ? GROUP BY sender
SELECT userid, COUNT(*) AS u_count FROM pm WHERE sender = ? GROUP BY userid

然后您将看到第一个查询返回具有给定userid 的消息数,按sender 细分;而第二个查询返回具有给定sender 的消息数,按userid 细分。因此,组合这些查询“并从中获得差异”没有多大意义。

【讨论】:

    【解决方案3】:

    你可以这样做:

    SELECT
        (SELECT count(*) FROM pm WHERE userid=".$userid" GROUP BY sender) AS s_count,
        (SELECT count(*) FROM pm WHERE sender=".$userid." GROUP BY userid) AS u_count,
        (SELECT s_count - u_count) AS result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      相关资源
      最近更新 更多