在 PHP 中创建相关文章查询
Creating a related articles query in PHP
我正在尝试制作类似于 "related articles" 的东西。这就是我的。
$query = "SELECT * FROM posts WHERE post_tags LIKE '%$post_tags%'";
我希望它“select 全部来自 post,其中 post 标签与当前 post 的标签相似”。
注意:标签在数据库中看起来是这样的:"tech, news, technology, iphone"
我调查了
$tags = explode(",", $post_tags );
但我不确定。
好吧,您可以使用 "IN" 子句代替 "LIKE"。
$Results = join("','",$post_tags);
$SQLQuery = "SELECT * FROM galleries WHERE id IN ('$Results')";
示例:Passing an array to a query using a WHERE clause
使用全文搜索 -- docs
SELECT * FROM `posts` WHERE MATCH(post_tags) AGAINST('$post_tags' IN BOOLEAN MODE)
查询将要求您将全文索引添加到 post_tags
table 列(除非您有较旧的 MyISAM table)。此查询将比您当前的尝试快很多。
查询添加索引
ALTER TABLE `posts` ADD FULLTEXT INDEX `tag_search` (`post_tags`)
更好、更快的方法
更改在数据库中存储 post-to-tag 关系的方式。你的 posts
table 不应该用来存储标签,因为一个 post 有很多标签,但是每个 post 在 post 中只有一条记录 table。相反,有另外两个 tables:
标签table
tag_id | name
1 | technology
2 | news
3 | hobbies
post_tags table
post_id | tag_id
1 | 1
1 | 3
2 | 1
请注意,很容易看出 post_id #1 具有 technology 和 hobbies 标签。这将使您的查询更容易、更快。
更快!
如果您确实想将所有内容存储在 posts
table 中但要获得更快的性能,则需要将标签存储为位标志。例如,如果在您的 PHP 应用程序中满足以下条件:
$techBit = 0b001; // number 1 in binary form
$newsBit = 0b010; // number 2 in binary form
$hobbiesBit = 0b100; // number 4 in binary form
然后很容易将标签存储在一个字段中。具有 technology 和 hobbies 标签的 post 将具有以下值:
$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
我正在尝试制作类似于 "related articles" 的东西。这就是我的。
$query = "SELECT * FROM posts WHERE post_tags LIKE '%$post_tags%'";
我希望它“select 全部来自 post,其中 post 标签与当前 post 的标签相似”。
注意:标签在数据库中看起来是这样的:"tech, news, technology, iphone"
我调查了
$tags = explode(",", $post_tags );
但我不确定。
好吧,您可以使用 "IN" 子句代替 "LIKE"。
$Results = join("','",$post_tags);
$SQLQuery = "SELECT * FROM galleries WHERE id IN ('$Results')";
示例:Passing an array to a query using a WHERE clause
使用全文搜索 -- docs
SELECT * FROM `posts` WHERE MATCH(post_tags) AGAINST('$post_tags' IN BOOLEAN MODE)
查询将要求您将全文索引添加到 post_tags
table 列(除非您有较旧的 MyISAM table)。此查询将比您当前的尝试快很多。
查询添加索引
ALTER TABLE `posts` ADD FULLTEXT INDEX `tag_search` (`post_tags`)
更好、更快的方法
更改在数据库中存储 post-to-tag 关系的方式。你的 posts
table 不应该用来存储标签,因为一个 post 有很多标签,但是每个 post 在 post 中只有一条记录 table。相反,有另外两个 tables:
标签table
tag_id | name
1 | technology
2 | news
3 | hobbies
post_tags table
post_id | tag_id
1 | 1
1 | 3
2 | 1
请注意,很容易看出 post_id #1 具有 technology 和 hobbies 标签。这将使您的查询更容易、更快。
更快!
如果您确实想将所有内容存储在 posts
table 中但要获得更快的性能,则需要将标签存储为位标志。例如,如果在您的 PHP 应用程序中满足以下条件:
$techBit = 0b001; // number 1 in binary form
$newsBit = 0b010; // number 2 in binary form
$hobbiesBit = 0b100; // number 4 in binary form
然后很容易将标签存储在一个字段中。具有 technology 和 hobbies 标签的 post 将具有以下值:
$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