【问题标题】:MySQL Select where Tag = "First tag" AND Tag = "Another tag" using reference tableMySQL Select where Tag = "First tag" AND Tag = "Another tag" 使用参考表
【发布时间】:2020-04-24 09:32:48
【问题描述】:

我有以下数据库结构:

表 peekable_tag 本质上是一个包含许多不同标签的字典。

表 peekable_url 是一个包含不同 URL 的表,然后每个 URL 可以引用到多个标签。

例如,像 carmechanic.com 这样的 URL 可以同时分配有标签“汽车”和“机械师”。 像 teslacardirectory.com 这样的 url 可以分配三个标签,“汽车”、“特斯拉”和“机械师”。

使用以下查询,我可以提取所有分配了 1 个关键字的网址,例如关键字“汽车”

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 个关键字......有没有办法在不限制可以使用多少个关键字的情况下实现我想要做的事情?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    使用聚合:

    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 match
    

    【讨论】:

    • 完美!像魅力一样工作 - 所以如果我要使用 3 个标签,我会改变 count() = 2;to have count() = 3;... 对吗?
    • @PaulF 。 . .没错。
    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多