2013-04-07 87 views
4

我有一個問題搞清楚mysql的發現,有兩個具體的「標籤」鏈接和相同的「hashid」做一個連接兩個表時發現排MySQL的:有多個標籤和相同的ID

假定我的表是這樣的:

鏈接

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 

我想返回有標籤的行BOTH「有用」和「真棒」

當前的(工作/快)查詢由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 

讀取後article我嘗試使用以下命令:

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 

確實工作,但它被設置成不可用令人難以置信的慢。

任何人都知道解決方案嗎?

回答

9

類型的問題稱爲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 

OUTPUT

╔══════╦════════════╦═══════╗ 
║ MD5 ║ URL  ║ TITLE ║ 
╠══════╬════════════╬═══════╣ 
║ a0a0 ║ google.com ║ foo ║ 
╚══════╩════════════╩═══════╝ 
+0

驚人。完美的作品。 – 2013-04-07 05:56:24

+0

不客氣':D' – 2013-04-07 06:01:04

+0

@JW웃,這會導致查詢緩慢嗎? – koogua 2013-06-08 16:49:49