在PHP中创建相关的文章查询

时间:2017-07-29 01:43:22

标签: php related-content

我正在尝试制作类似“相关文章”的内容。这就是我所拥有的。

$query = "SELECT * FROM posts WHERE post_tags LIKE '%$post_tags%'";

我希望它“从帖子标签与当前帖子的标签类似的帖子中选择所有内容”。

注意:数据库中的标签如下所示:“tech,news,technology,iphone”

我研究过像

这样的事情
$tags = explode(",", $post_tags );

但我不确定。

2 个答案:

答案 0 :(得分:1)

使用FullText搜索 - docs

SELECT * FROM `posts` WHERE MATCH(post_tags) AGAINST('$post_tags' IN BOOLEAN MODE)

Live demo

查询将要求您向post_tags表列添加FULLTEXT索引(除非您拥有较旧的MyISAM表)。此查询将比您当前的尝试快得多。

查询以添加索引

ALTER TABLE `posts` ADD FULLTEXT INDEX `tag_search` (`post_tags`)

更好,更快的方法

更改在DB中存储post-to-tag关系的方式。您的posts表不应该用于存储标签,因为一个帖子有很多标签,但每个帖子在posts表中只有一条记录。相反,还有另外两个表:

标签表

tag_id | name
1      | technology
2      | news
3      | hobbies

post_tags表

post_id | tag_id
  1     |  1
  1     |  3
  2     |  1

请注意,很容易判断post_id#1具有技术爱好标记。这将使您的查询更容易,更快。

更快!

如果您确实希望将所有内容存储在posts表中,但性能更快,则需要将标记存储为位标记。例如,如果PHP应用程序中存在以下情况:

$techBit    = 0b001; // number 1 in binary form
$newsBit    = 0b010; // number 2 in binary form
$hobbiesBit = 0b100; // number 4 in binary form

然后很容易将标签存储在一个字段中。具有技术爱好标记的帖子将具有值:

$tag = $techBit | $hobbiesBit; // 1 + 4 = 5

如果您想搜索所有具有技术或爱好的记录,您可以这样做:

// means: records where post_tags has either techBit or hobbiesBit turned ON
SELECT * FROM `posts` WHERE (`post_tags` & ($techBit | $hobbiesBit)) > 0

答案 1 :(得分:0)

而不是“LIKE”你可以使用“IN”条款。

$Results = join("','",$post_tags);   
$SQLQuery = "SELECT * FROM galleries WHERE id IN ('$Results')";

示例:Passing an array to a query using a WHERE clause