2016-06-29 11 views
1

先月末に特定のユーザーによって作成されたすべてのレコード(ビジネス)のレポートを作成する必要があります。私は次のクエリを生成し、毎月行を提供すると期待しています。しかし、このユーザーはこれらの月にレコード(企業)を作成していないので、空の結果[]が得られます。RIGHT OUTER JOINはWHEREで空の結果を返します

RIGHT OUTER JOINを使用してgenerate_series列を選択しているため、毎月行を受け取る予定ですが、発生しません。

start = 3.months.ago 
stop = Time.now 

new_businesses = Business.select(
    "generate_series, count(id) as new"). 
    joins("RIGHT OUTER JOIN (SELECT 
    generate_series(#{start.month}, #{stop.month})) series 
    ON generate_series = date_part('month', created_at) 
    "). 
    where(created_at: start.beginning_of_month .. stop.end_of_month). 
    where(author_id: creator.id). 
    group("generate_series"). 
    order('generate_series ASC') 

空の結果ではなく、月ごとに行を取得するようにクエリを変更するにはどうすればよいですか?私はPosgreSQLを使用しています。

UPDATE

このコードは動作します:

new_businesses = Business.select(
    "generate_series as month, count(id) as new"). 
    joins("RIGHT OUTER JOIN (SELECT 
    generate_series(#{start.month}, #{stop.month})) series 
    ON (generate_series = date_part('month', created_at) 
     AND author_id = #{creator.id} 
     AND created_at BETWEEN '#{start.beginning_of_month.to_formatted_s(:db)}' AND 
     '#{stop.end_of_month.to_formatted_s(:db)}' 
    ) 
    "). 
    group("generate_series"). 
    order('generate_series ASC') 
+0

あなたは 'LEFT OUTER JOIN'かを'使用してみましたFULL OUTER JOIN'の代わりに? – jmelesky

+0

@jmeleskyはい、同じ結果 – leemour

答えて

2

あなたの問題は、任意の外部結合が壊れているwhere一部です。例を考えてみましょう:

select * 
from a right outer join b on (a.id = b.id) 

それ意志戻りaからbとリンクされた値からのすべての行、しかし:aが存在しないすべての行をドロップ意志

select * 
from a right outer join b on (a.id = b.id) 
where a.some_field = 1 

歌うなどを行うための正しい方法はjoinクエリ部分にフィルタを配置することです:

select * 
from a right outer join b on (a.id = b.id and a.some_field = 1) 

または副問合せを使用します。

select * 
from (select * from a where a.some_field = 1) as a right outer join b on (a.id = b.id) 
関連する問題