在 mysql table 和 PHP 中搜索标签
Search tags in mysql table with PHP
我有一个 table 有一些提交,这个 table 有一个 tags
字段,我需要在里面搜索。
数据在table中以JSON格式保存,像这样:["basic","example","html","chart"]
我正在尝试寻找一种方法来搜索标签字段中的所有行,但不确定在采用这种格式时如何以最佳方式完成搜索。
用户提交要搜索的标签,例如:html
,然后我需要在所有行中搜索该标签,而不会产生太多开销。
我知道大多数人习惯说:你自己试过什么?
- 好吧,没什么。由于我不知道如何执行此操作,所以我知道如何在 sql 中搜索等等。但从来没有按照这个逻辑尝试过。
很简单,您可以尝试使用 like 查询
SELECT * FROM `post` WHERE `tags` LIKE '%html%';
在PHP变量中:
$tag = "html";
$query = mysql_query("SELECT * FROM `post` WHERE `tags` LIKE '%'.$tag.'%'");
此格式没有"best way"搜索。根本没有办法。
难怪你不知道该怎么做。我会告诉你更多——也没有人知道。标签永远不应以 json 格式存储。这就好像你造了一辆汽车,把轮子放在车顶上。然后来问,如何驾驶它。
您必须先学习数据库基础知识。然后以正确的方式创建您的 tables。为标签制作 单独的 table。 将每个标签存储在单独的行中。之后,您将能够以通常的方式搜索标签,使用 JOIN 查询将相应的记录附加到结果中。
$sql = "SELECT a.* FROM articles a, tags t WHERE aid=a.id AND tag=?";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($tag));
$data = $stmt->fetchAll();
您应该看看 MySQL 全文索引。
看看 manual and this Zend Developer article
但是您不应该对许多列使用全文搜索。
在我的一个项目中,我通过在 TEXT 列中连接要搜索的列并应用于其上的全文索引来解决它。
您应该创建另一个 table tag
,其中包含字段 name
、post_id
。
我相信这是执行搜索功能的最佳解决方案。
如果您没有创建数据库的权限table。这取决于您有多少 post。一些?数百甚至更多?如果没有你的 post table 的大行。您可以获取所有这些并解码为 PHP 数组,然后使用字符串比较。
或者,你可以放弃数据库方式,直接用缓存文件处理。如果用户 create/modify a post.
我们只需要写入缓存
但是你也可以使用不可靠的方式,使用 mysql 中的 like
运算符。
我有一个 table 有一些提交,这个 table 有一个 tags
字段,我需要在里面搜索。
数据在table中以JSON格式保存,像这样:["basic","example","html","chart"]
我正在尝试寻找一种方法来搜索标签字段中的所有行,但不确定在采用这种格式时如何以最佳方式完成搜索。
用户提交要搜索的标签,例如:html
,然后我需要在所有行中搜索该标签,而不会产生太多开销。
我知道大多数人习惯说:你自己试过什么? - 好吧,没什么。由于我不知道如何执行此操作,所以我知道如何在 sql 中搜索等等。但从来没有按照这个逻辑尝试过。
很简单,您可以尝试使用 like 查询
SELECT * FROM `post` WHERE `tags` LIKE '%html%';
在PHP变量中:
$tag = "html";
$query = mysql_query("SELECT * FROM `post` WHERE `tags` LIKE '%'.$tag.'%'");
此格式没有"best way"搜索。根本没有办法。
难怪你不知道该怎么做。我会告诉你更多——也没有人知道。标签永远不应以 json 格式存储。这就好像你造了一辆汽车,把轮子放在车顶上。然后来问,如何驾驶它。
您必须先学习数据库基础知识。然后以正确的方式创建您的 tables。为标签制作 单独的 table。 将每个标签存储在单独的行中。之后,您将能够以通常的方式搜索标签,使用 JOIN 查询将相应的记录附加到结果中。
$sql = "SELECT a.* FROM articles a, tags t WHERE aid=a.id AND tag=?";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($tag));
$data = $stmt->fetchAll();
您应该看看 MySQL 全文索引。 看看 manual and this Zend Developer article
但是您不应该对许多列使用全文搜索。 在我的一个项目中,我通过在 TEXT 列中连接要搜索的列并应用于其上的全文索引来解决它。
您应该创建另一个 table tag
,其中包含字段 name
、post_id
。
我相信这是执行搜索功能的最佳解决方案。
如果您没有创建数据库的权限table。这取决于您有多少 post。一些?数百甚至更多?如果没有你的 post table 的大行。您可以获取所有这些并解码为 PHP 数组,然后使用字符串比较。
或者,你可以放弃数据库方式,直接用缓存文件处理。如果用户 create/modify a post.
我们只需要写入缓存但是你也可以使用不可靠的方式,使用 mysql 中的 like
运算符。