在 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,其中包含字段 namepost_id。 我相信这是执行搜索功能的最佳解决方案。

如果您没有创建数据库的权限table。这取决于您有多少 post。一些?数百甚至更多?如果没有你的 post table 的大行。您可以获取所有这些并解码为 PHP 数组,然后使用字符串比较。

或者,你可以放弃数据库方式,直接用缓存文件处理。如果用户 create/modify a post.

我们只需要写入缓存

但是你也可以使用不可靠的方式,使用 mysql 中的 like 运算符。