【问题标题】:How to extract one value from imploded array in MySQL row如何从 MySQL 行中的内爆数组中提取一个值
【发布时间】:2020-02-07 18:24:29
【问题描述】:

我正在使用 implode 在 MySQL 数据库的一行中插入几个值。

implode(' ', $_POST['tag']);

假设我有一个名为 product 的表和名为 tags 的行,其中插入了 3 个不同的值,如下所示:

usb adapter charger

我曾尝试使用类似运算符 (%) 使用此方法,但没有成功。

$sql = "SELECT * FROM product WHERE tags='%usb%'";

如何在 mysql 查询中使用 WHERE 从内爆数组中仅提取一个值?

【问题讨论】:

  • LIKE not = 如果你想使用通配符
  • @YotamDahan 我明白这一点。而且你的所作所为是非常不明智的。请参阅 Nigel 提供的链接。
  • @YotamDahan 正是我的第一条评论显示的方式。您将拥有一个products 表、一个tags 表和一个product_tag 表(或其他类似名称)。 productsidnamedescription 等。tagsidnameproduct_tagidproductidtagid
  • 这能回答你的问题吗? A better way to search for tags in mysql table

标签: php mysql


【解决方案1】:

我同意 cmets 关于重新设计数据库的观点。乍一看似乎使用LIKE 肯定会得到你想要的结果,但在阅读@Patrick Q 的pan - panther 示例之后,LIKE 并不是一个好的解决方案很有意义。有一些方法可以准确地获取您正在寻找的标签字符串,但这可能会损害性能并且查询会更长且更复杂。因此,以下内容将演示使用您当前的 tags 数据值查询的样子:

MySQL query:

SELECT tags,
       SUBSTRING_INDEX(SUBSTRING_INDEX(tags,' ',FIND_IN_SET('usb',REPLACE(tags,' ',','))),' ',-1) v 
FROM   mytable
HAVING v = 'usb';

如您所见,有一些函数用于从数据单元格中获取确切的字符串。由于您的示例数据用空格分隔,FIND_IN_SET 用逗号标识值分隔,所以REPLACE 首先发生在tags 列上,以用逗号替换空格。然后使用SUBSTRING_INDEX 两次以使用在FIND_IN_SET 中提取的位置获取字符串。最后在最后HAVING 只得到你正在寻找的标签。

这里有更多演示:https://www.db-fiddle.com/f/joDa7MNcQL2RakTgBa7qBM/3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2013-12-15
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多