SQLite多表关联查询:如何拼接关联标签、主题字段得到指定结果表
SQLite查询语句实现方案
核心使用SQLite内置的GROUP_CONCAT()聚合函数实现多值拼接,为避免多表关联产生笛卡尔积导致拼接结果重复,采用先分维度聚合再关联基础表的逻辑编写:
SELECT b.group_id, b.group_name, IFNULL(t.tags, '') AS tags, IFNULL(th.themes, '') AS themes FROM base_table b LEFT JOIN ( -- 按组聚合拼接标签 SELECT tm.group_id, GROUP_CONCAT(t.tag_name, ', ') AS tags FROM tags_mapping tm INNER JOIN tags_table t ON tm.tag_id = t.tag_id GROUP BY tm.group_id ) t ON b.group_id = t.group_id LEFT JOIN ( -- 按组聚合拼接主题 SELECT thm.group_id, GROUP_CONCAT(th.theme_name, ', ') AS themes FROM theme_mapping thm INNER JOIN theme_table th ON thm.theme_id = th.theme_id GROUP BY thm.group_id ) th ON b.group_id = th.group_id ORDER BY b.group_id ASC;
补充说明
- 使用
LEFT JOIN保证基础表中无关联标签/主题的分组(如示例中的group_id=3)可正常返回 - 通过
IFNULL()将无关联数据的字段值转换为空字符串,匹配需求的输出格式 GROUP_CONCAT第二个参数指定分隔符为,,和示例输出格式完全一致- 如果你使用SQLite 3.30.0及以上版本,可在
GROUP_CONCAT中添加排序规则,例如需要按标签ID倒序拼接可写为GROUP_CONCAT(t.tag_name, ', ') ORDER BY t.tag_id DESC - 如果你的实际表名保留了空格(例如
Base Table),请将语句中对应的表名用反引号或双引号包裹即可正常执行
内容的提问来源于stack exchange,提问作者Nuri
相关产品推荐
相关产品推荐

