使用PHP和MySQL创建相关或类似的帖子
我正在环顾SO,想知道我将如何创建一个相关或类似的帖子,以使用PHP和MySQL在我的网站上显示?如何做到这一点的基本示例是什么?
我正在环顾SO,想知道我将如何创建一个相关或类似的帖子,以使用PHP和MySQL在我的网站上显示?如何做到这一点的基本示例是什么?
使用 MySQL 全文搜索 MATCH (col1,col2,...)反对 (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);
[编辑]:为什么不使用喜欢
:对OP的澄清:
因为它不会给出正确的结果。假设您当前的标题是“1980年的音乐”,并且您希望对此发表相关文章。现在,如果您使用,则只会显示完全包含“1980年音乐”一词序列的帖子。但是,如果您使用 ,则将显示包含 Music OR 1980 的帖子。此外,同时包含音乐和1980的帖子将显示在顶部,因为它为每个结果提供了a,并且我们按该分数进行排序。我希望这很清楚。LIKE
MATCH ... AGAINST
SCORE
[编辑]: 2:
如果您有类别,则可以添加 SQL 查询以获取更具体的结果。AND Category = '$CurrentCategory'
where clause
[编辑]:3:OP不能使用全文:
如果您无法使用全文(出于某种原因),则可以只显示同一类别的5个随机帖子。由于它们属于同一类别,因此它们至少以某种方式相关:
SELECT *
FROM articles
WHERE Category = '$CurrentCategory'
LIMIT 5
编辑的语法:在MySQL代码中将LIMTI更改为LIMIT
在大多数情况下,您需要为匹配列提供不同的权重。您可以通过以下方式执行此操作:
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替换为整数的权重即可。
这样工作,您需要将全文添加到每列:
ALTER TABLE articles ADD FULLTEXT (title);
ALTER TABLE articles ADD FULLTEXT (body);
如果是这种情况,请不要忘记从结果中排除当前帖子。您可以使用 WHERE 条件执行此操作,然后再使用如下所示:
WHERE id <> $CurrentPostId