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;