我有 3 个这样关联的表:
: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'
我已经有查询以不同的方式搜索和过滤,但我在返回这样的结果时非常努力地通过标签过滤,保留 all 标签相关标签:
| 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 的东西,我正在试验它。
在
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