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)
| 归档时间: |
|
| 查看次数: |
1732 次 |
| 最近记录: |