mysql:查找具有多个标记和相同ID的行

Jam*_*per 4 mysql sql select join

我有一个问题,在做两个表的JOIN时,找到mysql找到有两个特定'标签'和相同''hashid'的链接

假设我的表看起来像这样:

链接

md5     url         title   numberofsaves
-----------------------------------------
a0a0    google.com  foo     200
b1b1    yahoo.com   yahoo   100
Run Code Online (Sandbox Code Playgroud)

标签

 md5    tag
 ---------------
 a0a0   awesome
 a0a0   useful
 a0a0   cool
 b1b1   useful
 b1b1   boring
Run Code Online (Sandbox Code Playgroud)

我想返回标记为'有用'和'很棒'的行

用于按1标记查找链接的当前(工作/快速)查询:

SELECT links.title, links.numsaves FROM links LEFT JOIN tags ON links.md5=tags.md5 WHERE tags.tag = 'useful' ORDER BY links.numberofsaves DESC LIMIT 20
Run Code Online (Sandbox Code Playgroud)

阅读完一篇文章后,我尝试使用以下内容:

SELECT links.title, links.numsaves FROM links LEFT JOIN tags ON links.md5=tags.md5 GROUP BY tags.md5 HAVING SUM(tags.tag='useful') AND SUM(tags.tag='awesome') ORDER BY links.numberofsaves DESC LIMIT 20
Run Code Online (Sandbox Code Playgroud)

确实有效,但它无法令人难以置信地缓慢到无法使用.

谁知道解决方案?

Joh*_*Woo 10

调用问题的类型 Relational Division

SELECT  a.md5, 
        a.url,
        a.title
FROM    Links a
        INNER JOIN Tags b
            ON a.md5 = b.md5
WHERE   b.Tag IN ('awesome', 'useful') -- <<== list of desired tags
GROUP   BY a.md5, a.url, a.title
HAVING  COUNT(*) = 2                   -- <<== number of tags defined
Run Code Online (Sandbox Code Playgroud)

OUTPUT

?????????????????????????????
? MD5  ?    URL     ? TITLE ?
?????????????????????????????
? a0a0 ? google.com ? foo   ?
?????????????????????????????
Run Code Online (Sandbox Code Playgroud)