4

2 つのテーブルの JOIN を実行するときに、2 つの特定の「タグ」と同じ「hashid」を持つリンクを mysql で見つけるのに問題があります。

テーブルが次のようになっているとします。

リンク

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

'useful' と 'awesome' の両方のタグを持つ行を返したい

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

これ機能しますが、信じられないほど遅いため、使用できません。

誰でも解決策を知っていますか?

4

1 に答える 1

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

出力

╔══════╦════════════╦═══════╗
║ MD5  ║    URL     ║ TITLE ║
╠══════╬════════════╬═══════╣
║ a0a0 ║ google.com ║ foo   ║
╚══════╩════════════╩═══════╝
于 2013-04-07T05:46:13.907 に答える