我有以下数据库结构:

表peekable_tag本质上是一个包含许多不同标签的字典。
表peekable_url是一个充满不同URL的表,因此每个URL都可以引用多个标记。
例如,像carmechanic.com这样的url可以同时分配标签“汽车”和“机械师”。像teslacardirectory.com这样的url可以有三个标签,“汽车”,“特斯拉”和“机械师”被分配给它。
使用以下查询,我可以拉出分配了1个关键字的所有urls,例如,关键字"Car“
Select
peekable_tag.tag,
peekable_url.id,
peekable_url.url
From
peekable_tag Inner Join
peekable_urltotag On peekable_urltotag.peekable_tag_id = peekable_tag.id Inner Join
peekable_url On peekable_urltotag.peekable_URL_id = peekable_url.id
Where
peekable_tag.tag = 'Car'将同时返回两个URL。
然而..。
我如何改变这一点,以便我可以缩小搜索范围的多个关键字?因此,如果我搜索“汽车”和“特斯拉”作为关键字,只会出现teslacardirectory.com。
我试过了
peekable_tag.tag = 'Car' AND peekable_tag.tag = 'Tesla'但这不会返回任何结果。
我考虑过将一个搜索查询嵌套在另一个搜索查询中,但那样我就只能使用两个关键字了。或嵌套三个查询,但id限制为3个关键字...有没有办法在不限制关键字数量的情况下实现我想要做的事情?
发布于 2020-04-24 09:32:48
使用聚合:
Select u.id, u.url
From peekable_tag t Inner Join
peekable_urltotag ut
On ut.peekable_tag_id = t.id Inner Join
peekable_url u
On ut.peekable_URL_id = u.id
Where t.tag in ('Car', 'Tesla')
group by u.id, u.url
having count(*) = 2; -- both tags matchhttps://stackoverflow.com/questions/61399611
复制相似问题