Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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
Mysql SQL-在一个查询中显示3个不同的计数_Mysql_Sql - Fatal编程技术网

Mysql SQL-在一个查询中显示3个不同的计数

Mysql SQL-在一个查询中显示3个不同的计数,mysql,sql,Mysql,Sql,这三个查询中的每一个都独立工作。但是,我希望所有三个计数都显示在同一个查询中。除了WHERE语句中的细微变化外,它们是相同的 /* Display Total Message Count */ SELECT People.Name, COUNT(Messages.SenderID) as "Total Messages Sent" FROM Ballers.Messages JOIN Ballers.People WHERE Messages.SenderID = People.ID GROUP

这三个查询中的每一个都独立工作。但是,我希望所有三个计数都显示在同一个查询中。除了WHERE语句中的细微变化外,它们是相同的

/* Display Total Message Count */
SELECT People.Name, COUNT(Messages.SenderID) as "Total Messages Sent"
FROM Ballers.Messages JOIN Ballers.People
WHERE Messages.SenderID = People.ID
GROUP BY People.Name;

/* Display Text Message Count */
SELECT People.Name, COUNT(Messages.SenderID) as "Text Messages Sent"
FROM Ballers.Messages JOIN Ballers.People
WHERE Messages.SenderID = People.ID AND Type = "Text"
GROUP BY People.Name;

/* Display Picture Message Count */
SELECT People.Name, COUNT(Messages.SenderID) as "Picture Messages Sent"
FROM Ballers.Messages JOIN Ballers.People
WHERE Messages.SenderID = People.ID AND Type = "Picture"
GROUP BY People.Name;
我没有成功地在同一个表上输出所有三个查询。我尝试了很多不同的方法,但都给了我错误。我对SQL非常陌生,但我还没有完全掌握一切是如何工作的。以下是失败代码的一个示例:

/* Display All Message Counts, 3 Queries In One */
SELECT 
People.Name, 
(COUNT(Messages.SenderID) as "Messages Sent"
WHERE Messages.SenderID = People.ID),
(COUNT(Messages.SenderID) as "Text Messages Sent"
WHERE Messages.SenderID = People.ID AND Type = "Text"), 
(COUNT(Messages.SenderID) as "Picture Messages Sent"
WHERE Messages.SenderID = People.ID AND Type = "Picture")
FROM Ballers.Messages JOIN Ballers.People
GROUP BY People.Name;

这是没有测试过的,但沿着这些思路应该可以做到:

SELECT People.Name,
COUNT(*) AS AllMessages,
SUM(CASE WHEN Type='Text' THEN 1 ELSE 0 END) AS TextMessages,
SUM(CASE WHEN Type='Picture' THEN 1 ELSE 0 END) AS PictureMessages
FROM Ballers.Messages JOIN Ballers.People ON People.ID=Messages.SenderID
GROUP BY People.Name

您可以尝试以下方法:

SELECT
 `People1`.`Name`,
 COUNT(`Messages1`.`SenderId`) as `TotalMessagesSent`,
 COUNT(`Messages2`.`SenderId`) as `TextMessagesSent`,
 COUNT(`Messages3`.`SenderId`) as `PictureMessagesSent`
FROM
 `Messages` as `Messages1`
 JOIN `People` as `People1` ON (`Messages1`.`SenderId` = `People1`.`ID`),
 `Messages` as `Messages2`
 JOIN `People` as `People2` ON (`Messages2`.`SenderId` = `People2`.`ID` AND `Type`='Text'),
`Messages` as `Messages3`
 JOIN `People` as `People3` ON (`Messages3.`SenderId` = `People3`.`ID` AND `Type`='Pictures')
GROUP BY
 `People1`.`Name`
或者仅从“人员”表中选择并加入消息:

SELECT
 `People`.`Name`,
 COUNT(`Messages1`.`SenderId`) as `TotalMessagesSent`,
 COUNT(`Messages2`.`SenderId`) as `TextMessagesSent`,
 COUNT(`Messages3`.`SenderId`) as `PictureMessagesSent`
FROM
 `People`
 JOIN `Messages` as `Messages1` ON (`Messages1`.`SenderId` = `People`.`ID`)
 JOIN `Messages` as `Messages2` ON (`Messages2`.`SenderId` = `People`.`ID` AND `Type`='Text')
 JOIN `Messages` as `Messages3` ON (`Messages3.`SenderId` = `People`.`ID` AND `Type`='Pictures')
GROUP BY
 `People`.`Name`

也许它不完整,也没有经过测试。

搞定了。非常感谢你。为了让我清楚代码中发生了什么,让我试着解释一下,然后你让我知道我是否正确。Count(*)统计ON语句中的所有内容。接下来的两行基本上是为它们自己的计数做一个if语句(1表示递增,null表示不递增?或者你能在1所在的位置加一个2,它会每次递增2吗?)。另外,END语句是做什么的?@sakau2007您已经得到了它:每行上都有一种if语句。END关闭以大小写开头的语句。我对代码做了一些修改,使用SUM将所有1相加。COUNT只计算结果的数量,因此除了NULL之外,其他任何内容都可以。