sqlite匹配所有多对一条件

zkure5ic  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(374)

我有点喜欢sql,基本的查询很好,但这让我很困惑。我正在node.js中使用sqlite编写一个简单的照片管理器,其中不同的标签被附加到照片上,以便于查找。一个样本查找可能是找到我和我的妻子,无论是在旧金山或洛杉矶拍摄照片。照片表具有(除其他外)id和照片数据,标记表具有标记,链接表具有链接外键的行 (photoId, tagId) . 假设我和我妻子的标签有ID 1和2,sf是100,la是101,所以我想找到所有有标签(1和2)和(100或101)的照片ID。从洛杉矶或旧金山获取所有照片很容易: SELECT photo.id FROM photo, link WHERE (photo.id = link.photoId) AND link.tagId IN (100, 101) 对和进行类似的查询更为棘手。我认为下面的方法应该有效,但是有没有更好的方法呢? SELECT photo.id FROM photo INNER JOIN link ON photo.id = link.photoId WHERE link.tagId in (1, 2) GROUP BY photo.id HAVING COUNT(*) = 2; 链接表对 (photoId, tagId) 因此,计数应该与条件数匹配。
我认为这是可行的,但似乎是一个足够普遍的模式,所以应该有一个更好的方法。如果我对每个标记类型(人物、地点、日期、自定义等)执行相同类型的查询,并将它们相交,这样做对吗?数据库的大小不会太大,使用量也不会太大,所以效率并不重要,但我希望利用这个机会学习如何正确使用sql。
谢谢

6tdlim6h

6tdlim6h1#

我猜你的意思是说,你会做这种类型的查询更经常,所以我建议你创建一个关于你需要的列视图,然后你应该能够找到你的答案更快的方式。
比如照片id和标签id在不同的表中,所以不是每次都加入它们,而是每次都可以在它们上创建视图,这样就不需要每次都加入它们。
希望你在找这个。不客气!

gz5pxeao

gz5pxeao2#

我又看了一遍,结果发现不需要连接。下面的查询工作-如果有人认为这不是一个好的解决方案,请评论,以便我可以学习。
“表”链接在标记和照片之间建立多对多关系:

CREATE TABLE `link` (
  `id` INTEGER PRIMARY KEY,
  `tag` INTEGER not null,
  `photo` INTEGER not null,
  UNIQUE(tag, photo)
  );

查询结果是 SELECT photo FROM link WHERE tag IN (1, 2, 3) GROUP BY photo HAVING count(*) = 3; (3是此查询的in组中所需的ID数)
由于不需要photo表(来自它的其他信息将在另一个请求中提供),因此不需要连接,因此不需要视图

相关问题