Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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 从单个表中选择,应显示结果集为空的条件计数(*)_Mysql_Join_Count_Group By_Where - Fatal编程技术网

Mysql 从单个表中选择,应显示结果集为空的条件计数(*)

Mysql 从单个表中选择,应显示结果集为空的条件计数(*),mysql,join,count,group-by,where,Mysql,Join,Count,Group By,Where,这个问题在这里以不同的方式被问了上百次,但没有一个对我的例子有帮助: 一张表:mytable +-------+-------+ | feld1 | feld2 | +-------+-------+ | Hugo | 5 | | Anna | 5 | | Anna | 5 | | Otto | 6 | +-------+-------+ 4 rows in set (0.00 sec) 我希望得到以下结果: Hugo 1 Anna 2 Otto 0

这个问题在这里以不同的方式被问了上百次,但没有一个对我的例子有帮助:

一张表:mytable

+-------+-------+
| feld1 | feld2 |
+-------+-------+
| Hugo  | 5     |
| Anna  | 5     |
| Anna  | 5     |
| Otto  | 6     |
+-------+-------+
4 rows in set (0.00 sec)
我希望得到以下结果:

Hugo 1
Anna 2
Otto 0
这是不同的feld1条目,后跟feld2=5的条目数

我明白了

Hugo 1
Anna 2
我阅读了使用左连接来解决我的问题,但我没有找到有效的解决方案

除了许多其他尝试之外,我所做的都没有成功:

SELECT e.feld1, count(*) FROM mytable as e 
       LEFT JOIN mytable as f 
              ON e.feld1 = f.feld1 
WHERE f.feld2=5
GROUP BY e.feld1

我还尝试了许多我读到的东西,比如使用IS NULL或IFNULL或COALESCE…

您可以使用CASE将feld2值转换为1或0,然后将它们相加。像这样:

select feld1, sum(case feld2 when 5 then 1 else 0 end) from mytable group by feld1;
结果:

+-------+------------------------------------------+
| feld1 | sum(case feld2 when 5 then 1 else 0 end) |
+-------+------------------------------------------+
| Anna  |                                        2 |
| Hugo  |                                        1 |
| Otto  |                                        0 |
+-------+------------------------------------------+

查询编译器可能会因为没有命名要执行计数的表而感到困惑。因此,显式地命名要对哪个字段和哪个表执行计数就可以做到这一点

SELECT   e.feld1, count(f.feld1)
FROM     mytable as e 
           LEFT JOIN mytable as f 
              ON e.feld1 = f.feld1 
WHERE    f.feld2=5
GROUP BY e.feld1
或者,如果由于查询优化器正在删除外部联接(因为它看到某种null拒绝的情况),因此上述操作仍然不起作用,那么您可以使用子查询,如下所示。这将在联接操作通过查询优化器之前过滤结果

SELECT   e.feld1, count(f.feld1)
FROM     mytable as e 
           LEFT JOIN (select i.feld1 from mytable as i where i.feld2=5) as f 
              ON e.feld1 = f.feld1
GROUP BY e.feld1

编辑以将计数从“f”更改为值。

这很有效,看起来很简单!:-不确定,但是我,我希望这个求和函数的使用比使用计数要慢,不是吗?使用count,join版本是否还有其他解决方案?我敢打赌性能差异相当小。“计数”的问题在于,无法计数从集合中排除的记录。因此,不,我认为没有办法做到这一点,但如果有人想证明我错了,我也很高兴知道这是怎么做到的。我暂时删除了被接受的解决方案,所以其他人觉得有必要澄清这绝对不可能。我从其他主题中了解到,通过执行一个连接,当我在某个地方读到一个表时,该连接本身也应该是可能的,我可以将缩减集映射到完整的feld1条目集。明白了-我建议在任何情况下都对有用的帖子进行升级投票,无论哪一个帖子被接受,当然,我愿意这样做,但我还没有足够的声誉这么做…:-你的解决方案1给了我安娜,4雨果,1。。。解决方案2给了我Anna,4 Hugo,1 Otto,1…:-/很抱歉,我们应该计算由“f”而不是“e”返回的项目,因为我们对筛选元素中存在的内容感兴趣。计算“e”将给出从“e”开始的所有信息,因为它是考虑外部联接时的完整集合。不知道为什么安娜是双倍的,雨果不是。还是这样吗?第二个仍然不能完全正常工作。它提供了Anna 4、Hugo 1、Otto 0 Anna对于包含120万行的实际表,仍然是原来的两倍。运行该查询时,我得到了一个超时。不过,我一有机会,你就可以投赞成票。
SELECT   e.feld1, count(f.feld1)
FROM     mytable as e 
           LEFT JOIN (select i.feld1 from mytable as i where i.feld2=5) as f 
              ON e.feld1 = f.feld1
GROUP BY e.feld1