【问题标题】:Sqlite: Query to count the number of times a row is referenced in a 'through' tableSqlite:查询以计算“通过”表中引用行的次数
【发布时间】:2016-11-06 16:30:23
【问题描述】:

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

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

有人可以帮助我实现这一目标吗?或者提供替代方法?

【问题讨论】:

  • 请也添加标签表架构
  • @scaisEdge TABLE Tag: id: int, name: string
  • 看来你已经有答案了..如果你需要其他人请评论

标签: sql sqlite join


【解决方案1】:

我认为做你想做的最有效的方法将子查询移动到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 建立索引。

【讨论】:

  • 非常感谢!它完全按预期工作。 (有一个小的改动,而不是st.Tag_id = t.Tag_Id 我写了st.Tag_id = t.id
  • 查询中是否需要引用索引?
  • @Curtwagner1984 。 . .不会。SQL 优化器知道如何有效地使用索引。
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多