0

次のようなテーブル構造があります。

http://imgur.com/DswITVz

過去 30 日間の 1 日あたりのレコード数をカウントする完全に機能するクエリがあります。次のようになります。

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 日あたりのレコード数を数えたいと思いますが、ニュースレター = 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

4

3 に答える 3

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

(おそらく、これの 1 つのサブセレクトを最適化することができますが、どのように機能するかを明確にするために完全に実行しました)

于 2013-04-09T09:09:02.163 に答える
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 デモ

編集:ブール値であるため、単純化して単純に を使用することもできますがSUM(nyhedsbrev)、これnyhedsbrevはorのみで ある必要があります: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)

ここに画像の説明を入力

于 2013-04-09T09:09:11.377 に答える