【问题标题】:How to count records as "0" that have value "0" when using WHERE x = 1使用 WHERE x = 1 时如何将值为“0”的记录计为“0”
【发布时间】:2013-04-09 17:15:23
【问题描述】:

我有一个如下所示的表结构:

我有一个完美运行的查询,可以计算过去 30 天每天有多少条记录。它看起来像这样:

SELECT DATE(timestamp) AS date, COUNT(id) AS emails FROM 'emails WHERE timestamp >= now() - interval 1 month GROUP BY DATE(timestamp)

这会输出以下内容,非常好:

然而,接下来的事情对我来说似乎太难以想象了。现在我想计算过去 30 天每天有多少条记录,但仅限于时事通讯 = 1 的情况。

我试着写一个像这样的 WHERE 语句:

SELECT DATE(timestamp) AS date, COUNT(*) AS emails, nyhedsbrev FROM emails WHERE timestamp >= now() - interval 1 month AND nyhedsbrev = 1 GROUP BY DATE(timestamp)

... 输出如下:

问题是,它省略了 newsletter = 0 的记录,因此我无法将我的第一个查询与新查询进行比较,因为日期不匹配。我知道那是因为我使用 WHERE newsletter = 1。

我想要一个查询,而不是省略该记录,该查询仅从该日期开始放置一个“0”。我怎样才能做到这一点?最终的查询应该是这样输出的:

【问题讨论】:

    标签: mysql count where-clause


    【解决方案1】:

    您应该能够简单地使用SUM()IF() 来获得所需的输出:

    SELECT 
        DATE(timestamp) AS date, 
        COUNT(*) AS emails,
        SUM(IF(nyhedsbrev > 0, 1, 0)) as nyhedsbrev_count
    FROM 
        emails 
    WHERE 
        timestamp >= now() - interval 1 month
    GROUP BY 
        DATE(timestamp)
    

    SQLFiddle DEMO

    编辑:您甚至可以简化它,因为它是一个布尔值,只需使用SUM(nyhedsbrev),但这需要nyhedsbrev @ 987654328@或1

    SELECT 
        DATE(timestamp) AS date, 
        COUNT(*) AS emails,
        SUM(nyhedsbrev) as nyhedsbrev_count
    FROM 
        emails 
    WHERE 
        timestamp >= now() - interval 1 month
    GROUP BY 
        DATE(timestamp)
    

    【讨论】:

    • @NikolajSneftrupLundJensen 不客气 - 确保检查编辑,因为您可能只需使用 SUM(nyhedsbrev)
    • 是的。我最终只使用了它,它的工作就像一个魅力。
    【解决方案2】:

    可能最好获取日期列表,然后将其加入子查询以获得所需的计数。

    类似的东西

    SELECT Sub1.date, Sub2.emails, IFNULL(Sub3.emails, 0)
    FROM (SELECT DISTINCT DATE(timestamp) AS date
    FROM emails 
    WHERE timestamp >= now() - interval 1 month) Sub1
    LEFT OUTER JOIN (SELECT DATE(timestamp) AS date, COUNT(id) AS emails 
    FROM emails WHERE timestamp >= now() - interval 1 month 
    GROUP BY DATE(timestamp)) Sub2
    ON Sub2.date = Sub3.date
    LEFT OUTER JOIN (SELECT DATE(timestamp) AS date, COUNT(*) AS emails 
    FROM emails 
    WHERE timestamp >= now() - interval 1 month AND nyhedsbrev = 1 
    GROUP BY DATE(timestamp)) Sub3
    ON Sub1.date = Sub3.date
    

    (您可能可以优化其中的一个子选择,但我已经完整地完成了它以使其工作方式一目了然)

    【讨论】:

      【解决方案3】:

      假设时事通讯是布尔值 1/0,那么这可能会为您提供所需的表格:

      SELECT DATE(timestamp) AS date, COUNT(*) AS emails, nyhedsbrev 
      FROM emails WHERE timestamp >= now() - interval 1 month GROUP BY DATE(timestamp),nyhedsbrev ;
      

      只需添加另一个 GROUP BY 参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 2022-03-29
        • 1970-01-01
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多