3

3つのテーブルを相互に接続しました。キーワードと統計をクエリしています。

日付範囲ごとにデータを取得する必要があります。その特定の日付範囲のデータがない場合は、0の統計を返します。

私のクエリが次のようになっているとしましょう:
SELECTkeyword、SUM(stat)FROMkeywords WHERE date> = '2012-07-10' GROUPBYkeyword; |私のキーワード1|3|

を返します |私のキーワード2|6 | テーブルの内容の例: | id | キーワード| 統計| 日付| キーワードグループ| | 1 | 私のキーワード1| 2 | 2012-07-11 | 1 | | 2 | 私のキーワード1| 1 | 2012-07-12 | 1 | | 3 | 私のキーワード2| 6 | 2012-07-11 | 1 | | 4 | 私のキーワード3| 10 | 2012-07-09 | 1 | しかし、その日付範囲の統計がないキーワードがいくつかありますが、 それでも統計として0を表示するキーワードを取得したいと思います。このような:













|私のキーワード1|3 |
|私のキーワード2|6 |
|私のキーワード3|0 |

問題は、where句が見つからない値をブロックするという回避策があることです。
リレーションを持つ3つのテーブルがあると言ったように、LEFT JOINを使用してデータをクエリします。簡単にするために、その部分をクエリ例から除外しました。

表:キャンペーン
ID

表:KeywordGroupID 名
キャンペーン


表:
KeywordDataid
キーワード
統計
日付
keywordGroup

4

3 に答える 3

2

左結合でテーブルを正しく結合していると仮定して、次を使用します。

select keyword, ifnull(sum(stat),0) ... group by keyword

グループ化が適用される前にいくつかの統計を除外するのがWHERE句である場合は、日付条件をLEFTJOIN条件に移動する必要があります。

from KeywordGroup left join KeywordData on ... and date > '2012-07-10'

しかし、私は実際のクエリを見ずにこれ以上助けることはできません。:-)

于 2012-07-16T13:00:31.763 に答える
1

これを試して

select 
    t1.keyword,
    sum(t2.stat) as stat
from
(   
    select distinct keyword from keywords   
) as t1 left join
(
    SELECT keyword,SUM(stat) FROM keywords WHERE date >='2012-07-10' GROUP BY keyword
) as t2
on t1.keyword=t2.keyword;
于 2012-07-16T13:14:45.993 に答える
0

左アウタージョインを見たことがありますか?結合タイプの良いリファレンスは次のとおりです。

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

"To produce the set of records only in Table A, but not in Table B, 
we perform a left outer join, then exclude the records we don't want 
from the right side via a where clause."

ns

于 2012-07-16T13:00:22.450 に答える