我正在寻找改善网站搜索功能的最佳方法。
我有两个MySQL Tables'文章'和'标签'
- > “文章”中的列
aid (auto increment)
headline
..and a few more
- > “标签”中的列(每个标签的新条目)
tid (auto increment)
aid (ID from 'articles')
tag
例如,如果我的文章标题为“这是一篇绿色文章”,本文的标签为“blue”,“yellow”
让我们说另一篇文章标题为“这是另一个测试”,其中包含以下标记“blue”,“yellow”,“pink”和 “黑”
如果访问者现在正在搜索“绿色粉红色黑色” mysql应该找到文章“这是一篇绿色文章”以及其他文章因为它的标签“粉红色”和“黑色”
此外,我需要一个按照相关性对文章进行排序的功能。 所以在这个例子中应首先显示文章“这是另一个测试”,因为如果标签“粉红色”和“黑色”和文章“这是绿色文章“位于第二位(标题中仅为”绿色“)
在过去的几个小时里,我尝试了一些像match..against和join这样的查询,但这对我来说太复杂了。
有人暗示过我吗?
(抱歉我的英语不好)
答案 0 :(得分:2)
您的查询应如下所示:
SELECT
DISTINCT articles.aid
FROM articles
INNER JOIN tags
ON articles.aid = tags.aid
WHERE tags.tag IN ("green", "pink", "black");
由于两个表都有一个公共属性(即文章ID),因此可以使用INNER JOIN连接这两个表,并根据两个表中的其他属性(在本例中为标记名称)过滤结果。
上述查询将为您提供包含绿色,粉色或黑色标签的文章ID列表。
修改的
抱歉,我没有看到您对相关性的要求。如果您想了解每篇文章中找到的标签数量,请将其转换为GROUPed查询,并计算找到的标签数量:
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)