Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite:用于计算“通过”表中引用行的次数的查询_Sql_Sqlite_Join - Fatal编程技术网

Sqlite:用于计算“通过”表中引用行的次数的查询

Sqlite:用于计算“通过”表中引用行的次数的查询,sql,sqlite,join,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 这只是伪代码,而不是实际的表定义 我正在尝试创建一个

我有演员、图片、场景和标签的桌子。 演员、图片和场景可以有多个标记,反之亦然。因此,每一对之间的关系在一个表中表示,如下所示:

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查询,该查询将列出所有标记以及它们在每个through表中被引用的次数。例如,如果在3张图片和1个场景中使用标签“Sea”,则所需输出为:

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,因此它将类似于从场景标记,其中标记=t.Id


有人能帮我做到这一点吗?或者提供另一种方法

我认为最有效的方法是将子查询移动到select子句:

如果将子查询放在FROM子句中,则需要按Tag_id聚合子查询以执行所需操作。然而,如果您只寻找一个标记,那么这将是大量不必要的工作。FROM中的相关子查询将仅对标记id 73进行计数


注意:为了提高性能,您需要在所有四个表中的Tag_Id上建立索引。

请添加Tags表架构too@scaisEdge表标记:id:int,name:string似乎您已经有了答案。。如果您需要其他人,请发表评论。谢谢!它完全按照预期工作。我写了一个小改动,st.Tag\U id=t.Tag\U id=t.idDo索引需要在查询中引用?@Curtwagner1984。不会。SQL优化器知道如何有效地使用索引。
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;