使用PHP和&amp ;;创建相关或类似的帖子MySQL的

时间:2010-08-29 03:35:40

标签: php mysql

我正在环顾四周,并想知道我将如何使用PHP& amp;创建一个相关或类似的帖子显示在我的网站上MySQL的?如何做到这一点的基本例子是什么?

2 个答案:

答案 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