小编典典

mysql:查找具有多个标签和相同id的行

sql

我遇到一个问题,当执行两个表的联接时,无法确定mysql查找具有两个特定“标签”和相同“ hashid”的链接

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

链接

md5     url         title   numberofsaves
-----------------------------------------
a0a0    google.com  foo     200
b1b1    yahoo.com   yahoo   100

标签

 md5    tag
 ---------------
 a0a0   awesome
 a0a0   useful
 a0a0   cool
 b1b1   useful
 b1b1   boring

我想返回同时具有“有用”和“很棒”标签的行

当前(工作/快速)查询,用于按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

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

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

工作,但它是如此令人难以置信的缓慢,因为无法使用。

有人知道解决方案吗?


阅读 212

收藏
2021-04-17

共1个答案

小编典典

问题的类型称为 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

输出

╔══════╦════════════╦═══════╗
║ MD5  ║    URL     ║ TITLE ║
╠══════╬════════════╬═══════╣
║ a0a0 ║ google.com ║ foo   ║
2021-04-17