2016-11-06 2 views
1

У меня есть таблицы для актеров, изображений, сцен и тегов. Актеры, Картинки и Сцены могут иметь несколько тегов и наоборот. Таким образом, отношения между каждой парой представлены в таблицах через который выглядит следующим образом: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)) 

Проблема у меня есть Я не могу понять, как ссылаться на Id из первого выбора в секции соединения, поэтому вместо фиксированного 73 это будет что-то вроде from Scene_tag where Tag_id = T.id

Может ли кто-нибудь помочь мне в достижении этого? Или предложить альтернативный подход?

+0

0: – scaisEdge

+0

@scaisEdge 'TABLE Tag: 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 будут делать только счетчик тегов 73.

Примечание: Для производительности вы хотите индексы на Tag_Id во всех четырех таблицах.

+0

Большое спасибо! Он работает точно так, как ожидалось. (С небольшим изменением вместо 'st.Tag_id = t.Tag_Id' Я написал' st.Tag_id = t.id') – Curtwagner1984

+0

Нужно ли указывать индексы в запросе? – Curtwagner1984

+1

@ Curtwagner1984. , , Нет. Оптимизатор SQL знает, как эффективно использовать индексы. –

Смежные вопросы