【问题标题】:MySQL, count values by keyMySQL,按键计数值
【发布时间】:2021-09-13 11:15:36
【问题描述】:

我需要根据它们的存在或缺失来相应地计算表格上的值。

通过一个明确的例子,考虑一个有 2 个字段的表:

+-------+---------+
| K     | V       |
+-------+---------+
| key1  | 10      |
| key1  | 20      |
| key1  | Stefano |
| key1  | 40      |
| key1  | 50      |
| key1  | 60      |
| key1  | Stefano |
| key1  | 80      |
| key1  | 90      |
| key1  | 100     |
| key1  | 110     |
+-------+---------+
| key2  | 11      |
| key2  | 21      |
| key2  | 31      |
| key2  | Stefano |
| key2  | 51      |
| key2  | 61      |
| key2  | 71      |
| key2  | 81      |
| key2  | 91      |
| key2  | 101     |
+-------+---------+
| key3  | 13      |
| key3  | 23      |
| key3  | 33      |
+-------+---------+

如果 K 不存在,我的目标是计数 V = 'Stefano' 的出现次数为 -1:

select count(*) from TableName where K = 'key1' and V = 'Stefano'
> 2

select count(*) from TableName where K = 'key2' and V = 'Stefano'
> 1

select count(*) from TableName where K = 'key3' and V = 'Stefano'
> 0

如何获取值 [ -1 ] 查询缺失的键值?

select count(*) from TableName where K = 'missing_key' and V = 'Stefano'
> -1

【问题讨论】:

    标签: mysql sql count


    【解决方案1】:

    您想要-1 而不是0 似乎很愚蠢,但一种方法是:

    select coalesce(nullif(count(*), 0), -1)
    from TableName
    where K = 'missing_key' and V = 'Stefano';
    

    如果你想要一个特殊的非 0 值,我建议NULL

    注意:您可以在一个查询中完成所有操作:

    select k, sum( v = 'Stefano' )
    from tablename
    group by k;
    

    您也可以在这里使用coalesce(nullif()) 逻辑。

    编辑:

    如果您在缺少密钥时只想要-1,那么:

    select (case when count(*) = 0 then -1
                 else sum(v = 'Stefano')
            end)
    from TableName
    where K = 'missing_key';
    

    【讨论】:

    • 我认为您误读了这个问题。仅当表中不存在提供的密钥时,OP 才需要 -1。这是与键在表中但没有“Stefano”不同的情况。
    • 当我意识到这一点时,我正在写一个简单的 CASE
    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2023-02-24
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多