mySQL查询在单个字段中以任意顺序查找多个字符串?

时间:2018-01-25 21:15:28

标签: mysql

在数据库的一列中,我们存储了用于点击API的参数,例如,如果API调用为sample.api/call?foo=1&bar=2&foobar=3,那么该字段将存储foo=1&bar=2&foobar=3

如果确保它们按顺序排列,那么查询这些值中的2个或3个是很容易的,但这并不能保证。有可能使用bar=2&foo=1&foobar=3或任何其他组合参数进行调用。

有没有办法在不说的情况下进行查询:

SELECT * FROM table
WHERE value LIKE "%foo=1%"
AND value LIKE "%bar=2%"
AND value LIKE "%foobar=3%"

我也试过

SELECT * FROM table
WHERE "foo=1" IN (value)

但这根本没有产生任何结果。

编辑:我之前应该提到过,我不一定总是在寻找相同的参数。

1 个答案:

答案 0 :(得分:0)

But why?

执行简单的LIKE语句的问题是:

SELECT * FROM table
WHERE value LIKE "%foo=1%"

这将匹配值asdffoo=1foo=13。一个hacky solution就是这样做的:

SELECT * FROM `api`
WHERE `params` REGEXP '(^|&)foo=1(&|$)'
AND `params` ...

请注意,这不使用索引。如果您有一个大型数据集,则需要进行行扫描并且速度极慢!

或者,如果您可以以不同方式在数据库中存储信息,则可以使用FIND_IN_SET()功能。

-- Store in DB as foo=1,bar=2,foobar=3
SELECT * FROM `api`
WHERE FIND_IN_SET(`params`, 'foo=1')
AND FIND_IN_SET(`params`, 'bar=2')
...

唯一的其他解决方案是涉及另一个表,如下所示,并遵循this页面上的解决方案:

CREATE TABLE `endpoints` (
  `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `params` (
  `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `endpoint` int(6) NOT NULL,
  `param` varchar(200) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `idx_param` (`param`) 
) DEFAULT CHARSET=utf8;

最后和最后的建议是升级到5.7,并使用JSON功能。将数据作为JSON对象插入,并按this question

中所示进行搜索