sqlite 查询以返回所有关联的MTM元素,但仅当其中有特定的一个时

qhhrdooz  于 2023-04-12  发布在  SQLite
关注(0)|答案(1)|浏览(138)

我有三张这样的表格:

:Manga
| id | title     | author          |
|----+-----------+-----------------|
|  1 | Initial D | Yuki Urushibara |

:Tags            :Manga_Tags_Association
| id | name   |  | tag_id | manga_id |
|----+--------|  |--------+----------|
|  1 | racing |  |      1 |        1 |
|  2 | sports |  |      2 |        1 |
|  3 | chill  |  |      3 |       23 |
                 |      1 |        5 |

其中第三个表示漫画条目和标签之间的关联(因此'Initial D'被标记为'racing''sports'
我已经用不同的方式搜索和过滤了一些查询,但是我在返回这样的结果时,很难通过一个标签进行过滤,保留了 * 所有 * 与标签相关的标签:

| M.id | M.title   | tags                  |
|------+-----------+-----------------------|
|    1 | Initial D | racing, sports        |
|   55 | REDLINE   | sports, racing, scifi |

如果我正在过滤等于'racing'的标签,我该怎么做呢?我的尝试要么排除所有不是结果中指定的标签,看起来像这样...

| M.id | M.title   | tags   |
|------+-----------+--------|
|    1 | Initial D | racing |
|   55 | REDLINE   | racing |

......或者根本不起作用,就像我试过的那些,我以为我可以检查GROUP_CONCAT的内容(SELECT ..., GROUP_CONCAT(Tags.title) AS AllTags ... something something ''racing' IN AllTags;),因为它不是一个表。我也不能通过执行一个子查询来完成这一点,该子查询列出了与Manga.id相关的所有标记,并检查是否有任何行包含'racing',因为我不知道这是不是可能的(我找不到方法)。也不使用HAVING 'racing' IN一个别名为AllTags的子查询(和以前一样的问题,它抱怨 * 它不是一个表 *)。
编辑:好的,我刚刚看到了一些关于windows的东西,我正在尝试。

zsbz8rwp

zsbz8rwp1#

连接表,聚合并在HAVING子句中设置条件:

SELECT m.id, m.title,
       GROUP_CONCAT(t.name) tags
FROM Manga m
INNER JOIN Manga_Tags_Association mta ON mta.manga_id = m.id
INNER JOIN Tags t ON t.id = mta.tag_id
GROUP BY m.id
HAVING MAX(t.name = 'racing') = TRUE; -- just HAVING MAX(t.name = 'racing') will also do

相关问题