两个COUNT之间的区别

3
我有一个名为private_messagespm)的mysql表格,它长这样:
用户id --- 发送者 --- 文本
其中,用户id和发送者都是来自于user表格的ID。 现在我想要查询一个用户向另一个用户发送的私信数量与收到的该用户私信数量之间的差异,并按用户id分组。 因此,我想将这两个查询合并成一个,并从中获取差异:
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之间的差异。


如果你使用的是count *,为什么要使用group by呢? - user2541120
https://dev59.com/ZFXTa4cB1Zd3GeqP3qix?lq=1 - Ciro Santilli OurBigBook.com
3个回答

3
如果您想获取您通信过的每个用户的统计数据,只需使用 "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;

这里是一个用于测试的SQLfiddle


谢谢,这个完美地运作了!你能告诉我如何添加一个 where 子句,以便只选择差异大于 0 的行吗? - Tobias Baumeister
1
@TobiasBaumeister дҢ еЏҮд»ӨењЁжџӨиҮұиҮ­еЏӨзљ„GROUP BYиҰЊд№‹еђҺж·»еЉ дёЂдёҒHAVING SUM(sent) <> SUM(received)гЂ‚ - Joachim Isaksson

1
你最好将结果分组的任何列添加到选择列表中:
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分组。 因此,将这些查询合并“并从中得出差异”没有太多意义。

0
你可以像这样做:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接