在数据库的一列中,我们存储了用于点击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)
但这根本没有产生任何结果。
编辑:我之前应该提到过,我不一定总是在寻找相同的参数。
答案 0 :(得分:0)
执行简单的LIKE语句的问题是:
SELECT * FROM table
WHERE value LIKE "%foo=1%"
这将匹配值asdffoo=1
和foo=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。
中所示进行搜索