Php 合并两个不同列的mysql计数(*)结果
我正在尝试合并以下查询的计数:Php 合并两个不同列的mysql计数(*)结果,php,mysql,sql,aggregate-functions,Php,Mysql,Sql,Aggregate Functions,我正在尝试合并以下查询的计数: SELECT recipient AS otheruser, COUNT(*) FROM privatemessages WHERE sender = '$userid' GROUP BY recipient SELECT sender AS otheruser, COUNT(*) FROM privatemessages WHERE recipient = '$userid' GROUP BY sender 如
SELECT recipient AS otheruser, COUNT(*)
FROM privatemessages
WHERE sender = '$userid'
GROUP BY recipient
SELECT sender AS otheruser, COUNT(*)
FROM privatemessages
WHERE recipient = '$userid'
GROUP BY sender
如果仍然需要组合这两个查询,并将每个“其他用户”的计数(*)相加,最直接的方法是使用SUM/Condition
SELECT
CASE WHEN sender = '$userid' THEN recipient else sender END AS OtherUser,
SUM(sender = '$userid') AS RCount,
SUM(recipient = '$userid') AS SCount,
COUNT(*) total
FROM
privatemessages
WHERE
'$userid' IN (sender , recipient )
GROUP BY
OtherUser
更新
多亏了deltab和Michael Buen,我清理了SUM和GROUP BY语句。最简单的方法就是使用两个查询。
使用两个查询请求两个不同的数据集绝对没有坏处,但没有一个理由可以使用一个查询来执行此操作。您可以将它们与UNION结合起来,如下所示:
SELECT otheruser, COUNT(*) FROM
(SELECT recipient AS otheruser
FROM privatemessages
WHERE sender = '$userid'
GROUP BY recipient
UNION
SELECT sender AS otheruser
FROM privatemessages
WHERE recipient = '$userid'
GROUP BY sender)
然后在results函数中,调用count
while ($row = $result) {
echo $row['COUNT(total)'];
}
我相信这个问题应该如预期的那样有效。您的原始文件唯一的问题是双重别名和两个不同字段的分组。这在两个单独的查询中都是可能的,但如果组合在一起,则无法实现(至少别名是这样,但在GROUP BY中不这样认为)
希望这对你有用
更新
COUNT
的一个很好的替代方法是简单地使用num\u行
。。。因此,上述查询将是:
SELECT recipient AS r, sender AS s // can't use same alias
FROM privatemessages
WHERE s = '$userid' AND r = '$userid'
GROUP BY s;
然后在结果函数中,调用num_rows
函数:
mysql_num_rows($result);
你可以试试union,但不确定你要找的是不是“合并计数”我想你想把
计数的数字加在一起?还是我弄错了,您只是想合并这些查询?如果您只想将COUNT
的值加在一起,那么只需在查询调用后将它们加在一起即可。对于GROUP BY,您不能只使用GROUP BY OtherUser吗?另外,如果sender='$userid',则1 ELSE 0 END
可以简化为仅sender='$userid'
,当为真时为1,当为假时为0。@ConradFrix Yes@deltab是正确的,您只需执行SUM(sender=blah)
,聚合函数(SUM、COUNT等)忽略空结果或空表达式。(条件为1时,情况为0结束)
不会将查询保存为空;聚合函数已经为您完成了这项工作。看看这个例子:@MichaelBuen让我生气的是我知道你和deltab是对的,我只是抓住了一些FUD。谢谢我更新了我的答案和演示“让我生气的是我知道你和deltab是对的…”我发誓,一开始我读到这篇“让我生气的是我知道你,deltab是对的…”用牛津逗号透视法:D应该写为“让我生气的是我知道你和deltab都是对的…”但这是一口哈哈哈,我离题了。别生自己的气,放松点,干杯!ツ +1hmm我认为where语句应该是或而不是和@ConradFrix OP最初调用的是两个独立的查询,因此应该是和,因为它们是绝对独立的,当在两个独立的查询中出现时,它们是绝对独立的。@ConradFrix但你是正确的,作为或
会更有意义,但出于上述原因,我使用了和
。我不想重复这一点,但我认为给定用户不会同时是消息的发送者和接收者,这意味着它可能返回零行,@ConradFrix我同意,不想争论,但也许这个查询只是为了返回给定的$userid
已写入和接收的消息总数?这就是我的假设。
mysql_num_rows($result);