Mysql 从单个表中选择,应显示结果集为空的条件计数(*)
这个问题在这里以不同的方式被问了上百次,但没有一个对我的例子有帮助: 一张表:mytableMysql 从单个表中选择,应显示结果集为空的条件计数(*),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
+-------+-------+
| 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