1

ウェブサイトの検索機能を改善するための最良の方法を探しています。

2 つの MySQL テーブル「記事」と「タグ」があります。

->「記事」の列

aid (auto increment)
headline
..and a few more

-> 「タグ」の列 (すべてのタグの新しいエントリ)

tid (auto increment)
aid (ID from 'articles')
tag

たとえば、「これは緑の記事です」という見出しの記事があり、この記事のタグが「青」、「黄」の場合

「これは別のテストです」という見出しが付いた別の記事があり、「青」、「黄」、「ピンク」「黒」のタグが付いているとします。

訪問者が"green pink black"を検索している場合、 mysql は"This is a green Article" という記事と、 "pink""black"というタグがあるため、別の記事を見つける必要があります。

さらに、関連性によって記事を並べ替える機能が必要です。したがって、この例では、記事「This is another Test」が最初に表示される必要があります。これは、タグ「pink」「black」があり、記事「This is a green Article」が位置 2 (見出しの「green」のみ) にある場合です。

ここ数時間で、match..against や joins などのいくつかのクエリを試しましたが、これは私には複雑すぎます。

誰か私にヒントがありますか?

(下手な英語でごめんなさい)

4

1 に答える 1

4

クエリは次のようになります。

SELECT
    DISTINCT articles.aid
FROM articles
INNER JOIN tags
    ON articles.aid = tags.aid
WHERE tags.tag IN ("green", "pink", "black");

両方のテーブルには共通の属性 (記事 ID) があるため、INNER JOIN を使用して 2 つのテーブルを結合し、両方のテーブルの他の属性 (この場合はタグ名) に基づいて結果をフィルター処理できます。

上記のクエリは、緑、ピンク、または黒のタグのいずれかが付いた記事 ID のリストを提供します。

編集

申し訳ありませんが、関連性の要件がわかりませんでした。各記事で見つかったタグの数を知りたい場合は、グループ化されたクエリに変換し、見つかったタグの数をカウントします。

SELECT
    articles.aid,
    articles.headline,
    COUNT(tags.tid)
FROM articles
INNER JOIN tags
    ON articles.aid = tags.aid
WHERE tags.tag IN ("green", "pink", "black")
GROUP BY articles.aid;

シナリオを試してみてください...

まず、データベースをセットアップします。

mysql> CREATE TABLE articles (aid integer auto_increment, headline varchar(32), key(aid));
Query OK, 0 rows affected (0.13 sec)

mysql> CREATE TABLE tags (tid integer auto_increment, aid integer, tag VARCHAR(16), key(tid));
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO articles (headline) values ("This is a green Article"), ("This is another Test");
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles;
+-----+-------------------------+
| aid | headline                |
+-----+-------------------------+
|   1 | This is a green Article |
|   2 | This is another Test    |
+-----+-------------------------+
2 rows in set (0.00 sec)

mysql> INSERT INTO tags (aid, tag) VALUES (1, "blue"), (1, "yellow"), (2, "blue"), (2, "yellow"), (2, "pink"), (2, "black");
Query OK, 6 rows affected (0.04 sec)
Records: 6  Duplicates: 0  Warnings: 0

次に、いくつかのクエリを実行します。

mysql> SELECT articles.aid, articles.headline, COUNT(tags.tid) FROM articles INNER JOIN tags ON articles.aid = tags.aid WHERE tags.tag IN ("green", "pink", "black") GROUP BY articles.aid;
+-----+----------------------+-----------------+
| aid | headline             | COUNT(tags.tid) |
+-----+----------------------+-----------------+
|   2 | This is another Test |               2 |
+-----+----------------------+-----------------+
1 row in set (0.00 sec)

mysql> SELECT articles.aid, articles.headline, COUNT(tags.tid) FROM articles INNER JOIN tags ON articles.aid = tags.aid WHERE tags.tag IN ("green", "pink", "black", "yellow") GROUP BY articles.aid;
+-----+-------------------------+-----------------+
| aid | headline                | COUNT(tags.tid) |
+-----+-------------------------+-----------------+
|   1 | This is a green Article |               1 |
|   2 | This is another Test    |               3 |
+-----+-------------------------+-----------------+
2 rows in set (0.00 sec)
于 2012-08-29T21:06:13.307 に答える