Sqlite:查询计算'到'中引用行的次数。表

时间:2016-11-06 16:30:24

标签: sql sqlite join

我有演员,图片,场景和标签的表格。 演员,图片和场景可以有多个标签,反之亦然。因此,每对之间的关​​系用直观表示,如下所示:

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

有人能帮助我实现这个目标吗?或者提供另一种方法?

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上建立索引。