2016-11-06 6 views
1

私はActor、Picture、Scene、およびTagのテーブルを持っています。 アクター、ピクチャ、シーンに複数のタグを付けることができます。したがって、各ペア間の関係は次のようになり、テーブルを介して表現されます。Sqlite: 'スルー'テーブルで行が参照された回数をカウントするクエリ

TABLE Scene_tag: 
    Scene_id: int 
    Tag_id: int 

TABLE Picture_tag: 
    Picture_id: int 
    Tag_id: int 

TABLE Actor_tag: 
    Actor_id: int 
    Tag_id: int 

(これは単なる擬似コードではなく、実際のテーブル定義である)

私はSQLiteのクエリを作成しようとしていますすべてのタグと、各スルーテーブルで参照されている回数をリストします。例えば、タグ「海」が3枚と1つのシーンで使用されている場合は所望の出力は次のようになります。

name NumberOfScenes NumberOfPictures NumberOfActors 
sea  1     3     0 

私がこれまでに得たことは次のとおりです。

select T.name, NumberOfScenes, NumberOfPicture, NumberOfActors from Tags as T 
join(
select * from (
select count(*) AS NumberOfScenes from Scene_tag where Tag_id = 73) 
join (select count(*) AS NumberOfPicture from Picture_tag where Tag_id = 73) 
join (select count(*) AS NumberOfActors from Actor_tag where Tag_id = 73)) 

私がいる問題です私はどのように固定セクションの代わりに

のようなものになるのではなく、結合セクションの最初の選択からIDを参照する方法を把握することはできませんか?代替アプローチを提案していますか?

+0

タグテーブルのスキーマも追加してください。 – scaisEdge

+0

@scaisEdge 'テーブルタグ:id:int、name:string' – Curtwagner1984

+0

他の人が必要な場合は、すでに回答があります。 – scaisEdge

答えて

2

私はあなたがselect句にサブクエリを移動させたいものを行うための最も効率的な方法を考える:

select t.name, 
     (select count(*) from Scene_tag st where st.Tag_id = t.Tag_Id) as NumberOfScenes, 
     (select count(*) from Picture_tag pt where pt.Tag_id = t.Tag_id) as NumberOfPicture, 
     (select count(*) from Actor_tag ac where ac.Tag_id = t.Tag_id) as NumberOfActors 
from Tags t 
where t.tag_id = 73; 

あなたはFROM句にサブクエリを置く場合、あなたがTag_idでサブクエリを集約する必要がありますあなたが望むことをやりなさい。しかし、単一のタグだけを探している場合、これは多くの不必要な作業です。 FROMの相関サブクエリは、タグID 73のカウントだけを行います。

注:パフォーマンスを考慮して、4つのテーブルすべてでインデックスをTag_Idにします。

+0

ありがとうございました!期待どおりに動作します。 (st.Tag_id = t.Tag_Id'と書かれていますが、st.Tag_id = t.id'と書かれています) – Curtwagner1984

+0

インデックスでインデックスを参照する必要がありますか? – Curtwagner1984

+1

@ Curtwagner1984。 。 。いいえ.SQLオプティマイザは、インデックスを効果的に使用する方法を知っています。 –

関連する問題