查询以返回所有关联的 MTM 元素,但前提是其中包含特定元素

问题描述 投票:0回答:1

我有 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 的东西,我正在试验它。

sql sqlite join group-by having
1个回答
1
投票

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 
© www.soinside.com 2019 - 2024. All rights reserved.