pac*_*age 5 mysql sql null count aggregate-functions
我有a两个字段的表:id(PK)和f.
考虑以下记录:
id | f
1 | NULL
2 | 'foo'
3 | 'bar'
4 | NULL
5 | 'foo'
6 | 'baz'
Run Code Online (Sandbox Code Playgroud)
我想检索并计算具有不同f值的所有记录,包括每条记录WHERE f IS NULL.根据此条件,查询应返回除#5之外的所有记录,因为相同的值已包含在集合中,总计数将为5.
我用来检索所有记录的查询如下所示:
SELECT CASE WHEN EXISTS (SELECT id FROM a a2 WHERE a2.f = a.f AND a.id < a2.id) THEN 1 END AS not_distinct FROM a HAVING not_distinct IS NULL
如果可以改进此查询,我欢迎任何反馈.无论如何,主要的问题是计数.显然添加一个COUNT(*)将无济于事,我完全失去了如何计算过滤后的记录.
Boh*_*ian 11
有一个非常简单的方法可能适合您:
select count(distinct ifnull(f, id))
from a
Run Code Online (Sandbox Code Playgroud)
请注意,此查询假定f值永远不是id值,并且基于样本数据和经验,这是合理的.
我想到了它,并且有一个更简单的方法:
select count(distinct f) + sum(f is null) from a;
Run Code Online (Sandbox Code Playgroud)
你可以看到在sqlfiddle上运行
这是有效的,因为distinct抛出空值,并sum(condition)计算条件为真的次数,因为在mysql中,true为1false,而false为0.
NOT EXISTS在子句中使用WHERE:
SELECT count(*)
FROM a
WHERE NOT EXISTS (SELECT * FROM a a2 WHERE a2.f = a.f AND a2.id < a.id);
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您还可以获得实际行数 - 如果您需要的不仅仅是裸数:
SELECT *
FROM a
WHERE NOT EXISTS (SELECT * FROM a a2 WHERE a2.f = a.f AND a2.id < a.id)
Run Code Online (Sandbox Code Playgroud)
运算=符确保包含所有带有 的行f IS NULL。你的查询中已经有这个了。
这些都不起作用:
SELECT DISTINCT f FROM a;
SELECT * FROM a GROUP BY f;
Run Code Online (Sandbox Code Playgroud)
..因为两者也会折叠NULL值,并且你想要
每个记录 WHERE f IS NULL。
| 归档时间: |
|
| 查看次数: |
7863 次 |
| 最近记录: |