You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite多表关联查询:获取条目及关联标签的方法

获取SQLite条目及其关联标签的查询方案

首先先修正你提供的表创建脚本里的一个语法错误:entry_tags表中entry_id INTEGER后面的分号要改成逗号,否则建表会失败,修正后的entry_tags建表语句:

CREATE TABLE IF NOT EXISTS entry_tags(
    entry_id INTEGER,
    tag_id INTEGER,
    FOREIGN KEY (entry_id) REFERENCES entries(rowid),
    FOREIGN KEY (tag_id) REFERENCES tags(rowid)
);

接下来是查询方案,因为entries和tags是多对多关系,需要通过中间表entry_tags做关联查询,分两种场景:

1. 逐行返回每个标签对应条目信息

如果希望每个标签单独占一行(即使条目有多个标签,会返回多条记录,条目基础信息重复),可以用LEFT JOIN(确保无标签的条目也能被返回):

SELECT 
    e.timestamp,
    e.title,
    e.body,
    t.tag
FROM entries e
LEFT JOIN entry_tags et ON e.rowid = et.entry_id
LEFT JOIN tags t ON et.tag_id = t.rowid
-- 替换成你要查询的条目条件,比如按rowid筛选
WHERE e.rowid = 1;
  • 若只需要返回有标签关联的条目,把LEFT JOIN换成INNER JOIN即可。
  • 也可以根据标题筛选,把WHERE条件改成e.title = '你的目标标题'。

2. 将所有标签合并为单个字段返回

如果希望把条目所有标签合并成一个用分隔符分隔的字符串(比如逗号),可以用SQLite内置的GROUP_CONCAT函数:

SELECT 
    e.timestamp,
    e.title,
    e.body,
    GROUP_CONCAT(t.tag, ', ') AS tags
FROM entries e
LEFT JOIN entry_tags et ON e.rowid = et.entry_id
LEFT JOIN tags t ON et.tag_id = t.rowid
WHERE e.rowid = 1
GROUP BY e.rowid;

这种方式返回的结果只有一行,tags字段会包含该条目所有关联标签,比如"工作, 生活"。


内容的提问来源于stack exchange,提问作者David Shaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:09:57