sql - 在sqlite多对多示例中,如何获取2个标签共有的书签?

标签 sql database sqlite many-to-many

我正在用 Python(Flask) 创建一个简单的书签管理 web 应用程序,但主要是为了获得 SQL 方面的经验(使用 sqlite)。我正在使用标签,我们可以以多对多的方式链接到书签(类似于 stackoverflow 问题)。我创建了 3 个表,如下所示:

bookmarks :
bm_id | bm_title  | bm_link
1     | bm_title1 | bm_link1
2     | bm_title2 | bm_link2
3     | bm_title3 | bm_link3
4     | bm_title4 | bm_link4

tags :
bm_id | t_name  
1     | t_name1
2     | t_name2
3     | t_name3
4     | t_name4

bookmarktag :
bmt_id | bookmark_id | tag_id
3      |     3       |   3
5      |     3       |   2
6      |     4       |   3
7      |     4       |   2
1      |     1       |   1
2      |     1       |   2
4      |     3       |   1
8      |     2       |   3

我知道如何列出与特定标签关联的所有书签。

但是我想知道如何列出 2 个特定标签共有的书签。 例如,如果我要搜索标签 2 和 3 共有的书签;它应该只显示书签 3 和 4。

我只能使用 SELECT * FROM bookmarktag bmt WHERE bmt.tag_id=2 OR bmt.tag_id=3; 列出与标签 2 和 3 关联的所有书签。但您可能知道,它列出了链接到标签 2 和 3 的所有书签。

谢谢!

最佳答案

许多集合操作可以通过 compound queries 完成:

SELECT *
FROM bookmarks
WHERE bm_id IN (SELECT bookmark_id FROM bookmarktag WHERE tag_id = 2
                INTERSECT
                SELECT bookmark_id FROM bookmarktag WHERE tag_id = 3)

关于sql - 在sqlite多对多示例中,如何获取2个标签共有的书签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23152030/

相关文章:

php - 如果搜索为空,如何显示所有结果

mysql - 比较一个查询中两个不同的查询输出

c# - 在 Visual Studio 2005 中使用 Crystal Reports(C# .NET Windows 应用程序)

mysql - 关系数据库和自动递增

c++ - 用于定位对象的序列化和数据库技术

node.js - 使用sequelize批量更新sqlite数据库中的表

php - SQLite选择多个外键到一行

sql - 所需的总组数。在 MySql 中按自定义查询分组

c - 动态调整大小的结构 - 学习 C 的艰难之路 Ex17

sql - SQLite触发器优化