2013-04-09 80 views
0

我有一个表结构,看起来像这样当数记录为“0”有值“0”:如何使用其中x = 1

http://imgur.com/DswITVz

我有一个完美的工作查询计数过去30天里每天有多少条记录。它看起来喜欢这样的:

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

这个输出是完全正常的情况如下:

http://imgur.com/QkwTgiD

然而,接下来的事情似乎太难,我想象。现在,我要算多少条记录已经出现了每天在过去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) 

.. 。和输出以下内容:

http://imgur.com/kIVKYjc

的问题是,它与通讯= 0省略了记录,并有由我不能比我第一次查询对新的,因为日期犯规匹配。我知道这是因为我使用WHERE通讯= 1。

而不是忽略记录我想要一个查询,只是从该日期“0”。我怎样才能做到这一点?最后的查询应输出这样的:

http://imgur.com/XlcovbN

回答

0

您应该能够只需使用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只有01

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) 

enter image description here

+0

它做到了!非常感谢为我整理了这个! – NegO 2013-04-09 09:18:14

+0

@NikolajSneftrupLundJensen不用客气 - 确保你检查了编辑,因为你可能简单地使用'SUM(nyhedsbrev)'。 – h2ooooooo 2013-04-09 09:19:01

+0

是的。我最终只使用了它,并且像魅力一样工作。 – NegO 2013-04-09 09:23:18

0

最可能获得的日期列表,然后左连接,针对子查询来获得您所需要的计数。

像这样的事情

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 

(你也许可以优化该走一个子查询,但我已经完全做到了以明确它是如何工作)

0

假设简报是布尔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参数。

相关问题