我正在环顾四周,并想知道我将如何使用PHP& amp;创建一个相关或类似的帖子显示在我的网站上MySQL的?如何做到这一点的基本例子是什么?
答案 0 :(得分:31)
使用MySQL全文搜索MATCH (col1,col2,...) AGAINST (expr [search_modifier])
。
假设您的表格为articles
,您需要查找有关当前帖子标题的相关帖子。这样做:
SELECT *, MATCH(title, body) AGAINST('$CurrentPostTitle') AS score
FROM articles
WHERE MATCH(title, body) AGAINST('$CurrentPostTitle')
ORDER BY score DESC LIMIT 5
这将为您提供前5个相关帖子。
但首先要记住通过运行此查询启用该表的列的全文搜索:
ALTER TABLE articles ADD FULLTEXT (title, body);
[编辑]:为什么不使用 LIKE
:澄清OP:
因为它不会给出正确的结果。让我们说你现在的标题是“1980年的音乐”,你想要相关的帖子。现在,如果您使用LIKE
,则只会显示包含“1980年的音乐”字样序列的帖子。但是,如果您使用MATCH ... AGAINST
,则会显示包含Music OR 1980的帖子。此外,包含Music和1980的帖子将显示在Top上,因为它为每个结果提供SCORE
,我们按照该分数排序。我希望这很清楚。
[编辑]:2 :
如果您有类别,可以在SQL查询AND Category = '$CurrentCategory'
中添加where clause
以获得更具体的结果。
[编辑]:3:OP无法使用全文:
如果您无法使用全文(由于某种原因),您只需显示同一类别中的5个随机帖子。由于它们属于同一类别,它们至少在某种程度上相关:
SELECT *
FROM articles
WHERE Category = '$CurrentCategory'
LIMIT 5
编辑语法:在MySQL代码中将LIMTI更改为LIMIT
答案 1 :(得分:0)
在大多数情况下,您将希望为匹配的列提供不同的权重。您可以通过以下方式做到这一点:
SELECT
*,
ROUND(0 +
(MATCH(title) AGAINST('$CurrentPostTitle') * TITLE_WEIGHT) +
(MATCH(body) AGAINST('$CurrentPostTitle') * BODY_WEIGHT)) AS score
FROM
articles
HAVING
score > 0
ORDER BY
score DESC
LIMIT 5
只需将权重TITLE_WEIGHT和BODY_WEIGHT替换为整数即可。
以这种方式工作,您将需要在每列中添加FULLTEXT:
ALTER TABLE articles ADD FULLTEXT (title);
ALTER TABLE articles ADD FULLTEXT (body);
如果是这种情况,请不要忘记从结果中排除当前帖子。您可以在具有这样的条件之前使用WHERE条件进行此操作:
WHERE id <> $CurrentPostId