android - 如何在 Sqlite 中链接两个表?
问题描述
有2张桌子:
CREATE TABLE note (
note_id TEXT PRIMARY KEY,
note_text TEXT
);
CREATE TABLE tag (
tag_id TEXT PRIMARY KEY,
tag_text TEXT
);
我想链接笔记和标签,就像一个笔记应用程序。
您可以为笔记设置标签。此外,您可以使用标签搜索笔记。
怎么写SQL?
解决方案
您正在描述多对多关系。这建议使用第三个表,它引用两个基表,并且每个关联都存储在不同的行中:
create table tag_notes (
tag_id int references tags(tag_id),
note_id int refereences notes(note_id),
primary key (tag_id, note_id)
)
请注意,我int
对外键列使用了数据类型——这确实是您应该对基表的主键使用的数据类型。
进行此设置后,您可以使用以下查询通过文本搜索与给定标签相关的所有注释:
select n.*
from notes n
inner join tag_notes tn on tn.note_id = n.note_id
inner join tags t on t.tag_id = tn.tag_id
where t.tag_text = 'mytag'
或者有一个exists
条件:
select n.*
from notes n
where exists (
select 1
from tag_notes tn
inner join tags t on t.tag_id = tn.tag_id
where t.tag_text = 'my tag' and tn.note_id = n.note_id
)
推荐阅读
- java - 授权仅适用于 GET 请求
- database - 如何从 ElementCollection 中提取数据
- ruby - 用相应数量的“-”替换一个数字
- django - 使用 Django Channels 在模型中添加新记录时创建用户通知的最佳解决方案是什么?
- android - 创建仅设置属性的“假”属性
- c - 找到硬编码号码
- ajax - ASP.net MVC 5 部分视图 Ajax POST 不只更新部分
- c++ - 这段代码打印 x 的值在 5000 左右,但不是 10000,这是为什么呢?
- ansible - 使用 Ansible 在 Route 53 中列出 100 多条记录
- oracle - 相对于时区将 TIMESTAMP 转换为 DATE