我有演员,图片,场景和标签的表格。 演员,图片和场景可以有多个标签,反之亦然。因此,每对之间的关系用直观表示,如下所示:
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查询,列出所有标记以及每个标记在每个表中引用的次数。例如,如果标签' Sea'在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
,它会像{{{{{} 1}}
有人能帮助我实现这个目标吗?或者提供另一种方法?
答案 0 :(得分: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
上建立索引。