2016-11-06 17 views
1

我有Actor,Picture,Scene和Tag的表。 參與者,圖片和場景可以有多個標籤,反之亦然。因此,每一對之間的關​​系是在通過表來表示,看起來像這樣:Sqlite:查詢以統計在'through'表中引用行的次數

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)) 

我遇到的問題是我無法弄清楚如何引用一個身份證從第一選擇在連接部分,所以而不是固定的73它會像from Scene_tag where Tag_id = T.id

有人可以幫助我實現這一目標嗎?或者提供一種替代方法?

+0

請同時添加標籤表格模式 – scaisEdge

+0

@scaisEdge TABLE表格標籤: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進行計數。

注意:爲了提高性能,您需要在所有四個表中的Tag_Id上進行索引。

+0

Many Thanks!它完全按預期工作。 (用一個小的改變,而不是'st.Tag_id = t.Tag_Id',我寫了'st.Tag_id = t.id') – Curtwagner1984

+0

索引是否需要在查詢中被引用? – Curtwagner1984

+1

@ Curtwagner1984。 。 。不。SQL優化器知道如何有效地使用索引。 –