Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 合并两个不同列的mysql计数(*)结果_Php_Mysql_Sql_Aggregate Functions - Fatal编程技术网

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);