我遇到一个问题,当执行两个表的联接时,无法确定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
这 不 工作,但它是如此令人难以置信的缓慢,因为无法使用。
有人知道解决方案吗?
问题的类型称为 Relational Division
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 ║