2011-12-18 4 views
0

私はこのようなテーブルを持っています - http://d.pr/jQ1Pそして、すべてのユーザーが行ったことのリストを含む別のテーブル( "アクション"テーブルと呼ぶことにしましょう)。次のシナリオのクエリを作成するにはどうすればよいですか?

referrer_id "1"が参照した新規ユーザーの数に、「アクション」テーブルに少なくとも1つのエントリが含まれていることを示すクエリを作成するにはどうすればよいですか?例えば。 referrer_id "1"、 "1723"、 "1724"の場合は、両方とも "actions"テーブルに少なくとも1行ありますが、 "1725"ではありません。 1725" 。理にかなって

希望。

+2

あなたは右のそれにスキーマを追加した場合、あなたの質問を理解することが容易になるだろう。あなたは 'explain actions'または' show create table actions'を実行することによってテーブル定義を得ることができます。そして、他のテーブルについても同じことをしてください。 –

+0

「行動」は - http://d.pr/BHne、ここでは「紹介」 - http://d.pr/V2Eiです。 –

+0

@コービンのソリューションはあなたのために機能しませんか? –

答えて

2

あなたが行く:

SELECT 
    COUNT(DISTINCT r.new_user_id) 
FROM 
    referral r  
    JOIN actions a ON a.fk_userid = r.new_user_id 
WHERE 
    r.referrer_id = 1; 
2

、JOINを使用して、あなたは行がある場合は、その後、少なくとも1行が結合テーブルで一致したことを知っている。あなたが引っ張ってGROUP BYとそれを組み合わせることができます、すべてのものを、少しそれについて考え仮定した後にインデックスが作成されます。ユニークなIDが、私は、これははるかに効率的な方法で可能性が感じを持っていますが、心に来る最初の事はある:

SELECT 
    COUNT(referrals.new_user_id) 
FROM 
    referrals 
    JOIN actions ON actions.user_id = referrals.new_user_id 
WHERE 
    referrals.referrer_id = 1 
GROUP BY referrals.new_user_id; 

編集私より効率的なソリューションを考えることはできません。軽度のグーグルグルグは、GROUP BYを使用する代わりにCOUNT(DISTINCT referrals.new_user_id)が高速かもしれないことを示唆しています。ここで

関連する問題