2011-10-26 5 views
0

私はpostresqlを使用していますが、私は本当にconstruting SQLクエリで悪いです。 私はこのクエリを持っており、それが動作します:PostgreSQL:join + outer-join + sub-selectで値を比較する問題。

SELECT handhistories FROM handhistories 
JOIN pokerhands using (pokerhand_id) 
JOIN gametypes using (gametype_id) 
RIGHT OUTER JOIN playerhandscashkeycolumns using (pokerhand_id) 
    WHERE pokerhands.site_id=0 
    AND pokerhands.numberofplayers>=5 and pokerhands.numberofplayers<=7 
    AND (bigblind = 2 OR bigblind = 4) 
    AND player_id in 
     (SELECT player_id FROM playerhandscashkeycolumns GROUP BY player_id 
     HAVING AVG(case didvpip when true then 100::real else 0 end) <= 20) 

が、私はまた、このようなものになりますが、ofcourseのそれは動作しませんので、下から「有する」最後を制限したいです。

SELECT handhistories FROM handhistories 
JOIN pokerhands using (pokerhand_id) 
JOIN gametypes using (gametype_id) 
RIGHT OUTER JOIN playerhandscashkeycolumns using (pokerhand_id) 
     WHERE pokerhands.site_id=0 
     AND pokerhands.numberofplayers>=5 and pokerhands.numberofplayers<=7 
     AND (bigblind = 2 OR bigblind = 4) 
     AND player_id in 
     (SELECT player_id FROM playerhandscashkeycolumns GROUP BY player_id 
     HAVING AVG(case didvpip when true then 100::real else 0 end) <= 20 
     AND HAVING AVG(case didvpip when true then 100::real else 0 end) > 10) 

「保存」した後の値はどのようにしてそれを下からも比較することができますか? ありがとうございます。

+1

didvpipはブール値で、パーセンテージ(範囲)を選択しますか?また、:tabledefinitionsを追加してください。 – wildplasser

答えて

1

これは主にどのようなです@ワイルドプラザーはすでに指摘されている
..間違いを間違えてBETWEEN
..とJOINの代わりにIN構造体ですが、これは通常PostgreSQLでは高速です。
..

SELECT handhistories 
FROM handhistories 
JOIN pokerhands USING (pokerhand_id) 
JOIN gametypes USING (gametype_id) 
RIGHT JOIN playerhandscashkeycolumns USING (pokerhand_id) 
JOIN (
    SELECT player_id 
    FROM playerhandscashkeycolumns 
    GROUP BY player_id 
    HAVING avg(CASE WHEN didvpip THEN 100::real ELSE 0 END) > 10 
    AND avg(CASE WHEN didvpip THEN 100::real ELSE 0 END) <= 20 
    ) p USING (player_id) 
WHERE pokerhands.site_id = 0 
AND pokerhands.numberofplayers BETWEEN 5 AND 7 
AND bigblind IN (2,4); 

あなたのいくつかの列をテーブル-資格読みやすいが、pokerhands.site_idではなく、他の人のように、handhistoriesのように、あなたはそれをクリーンアップすることがあります。

+0

ありがとう、それは私が必要としたものです、皆さんは本当に有用なおかげです。 :-) –

1

あなたのために働くでしょうか?

HAVING AVG(case didvpip when true then 100::real else 0 end) BETWEEN 10 AND 20 

(BTW:醜いSQLの構文、キーワードを再利用)

UPDATE:また、クエリの残りの部分を簡素化するために使用することができます。

AND pokerhands.numberofplayers BETWEEN 5 AND 7 
AND bigblind IN (2, 4) 
+0

'x BETWEEN 10 AND 20'は、' x> = 10 AND x <= 20'に変換され、** 'x> 10 AND x <= 20'に変換されません。 –

+0

悪魔は詳細です。範囲を実装する最も実用的な方法は、(x> = a && a wildplasser