【问题标题】:Sqlite select from multiple tablesSqlite 从多个表中选择
【发布时间】:2021-11-08 01:43:13
【问题描述】:

我有五张桌子,比如

基表

| group_id | group_name  |
|----------|-------------|
| 1        | gn1         |
| 2        | gn2         |
| 3        | gn3         |

“标签”表

| tag_id | tag_name |
|--------|----------|
| 1      | tgn1     |
| 2      | tgn2     |
| 3      | tgn3     |

“主题”表

| theme_id | theme_name |
|----------|------------|
| 1        | thn1       |
| 2        | thn2       |
| 3        | thn3       |

“标签”映射表

| rec_id | group_id | tag_id |
|--------|----------|--------|
| 1      | 1        | 2      |
| 2      | 1        | 3      |
| 3      | 2        | 1      |

“主题”映射表

| rec_id | group_id | theme_id |
|--------|----------|----------|
| 1      | 1        | 2        |
| 2      | 2        | 3        |
| 3      | 2        | 1        |

我在创建 SQLite 查询以获取这样的表时遇到了一些问题:

| group_id | group_name | tags       | themes     |
|----------|------------|------------|------------|
| 1        | gn1        | tgn2, tgn3 | thn2       |
| 2        | gn2        | tgn1       | thn3, thn1 |
| 3        | gn3        |            |            |

【问题讨论】:

    标签: sql database sqlite select


    【解决方案1】:

    group_concat 函数可以解决问题 - 加入所有表,按组 ID 和名称分组,group_concat 其他详细信息:

    SELECT   g.group_id, 
             g.group_name,
             GROUP_CONCAT(t.tag_name, ', ') AS tags
             GROUP_CONCAT(th.theme_name, ', ') AS theme
    FROM     groups g
    JOIN     tags_map tg ON g.group_id = tm.group_id
    JOIN     tags t ON t.tag_id = tm.tag_id
    JOIN     themes_map thm ON g.group_id = thm.group_id
    JOIN     themes the ON th.theme_id = thm.theme_id
    GROUP BY g.group_id, g.group_name
    

    【讨论】:

      【解决方案2】:

      一个非常简单的方法使用相关子查询:

      select b.*,
             (select group_concat(t.tag_name)
              from tag_mapping tm join
                   tags t
                   on tm.tag_id = t.tag_id
              where tm.group_id = b.group_id
             ) as tags,
             (select group_concat(t.theme_name)
              from theme_mapping tm join
                   themes t
                   on tm.theme_id = t.theme_id
              where tm.group_id = b.group_id
             ) as themes
      from base b;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-28
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        相关资源
        最近更新 更多