我在名为过滤器的表中有一个字段,它可以有逗号分隔值 1,2,3 或 3,1 或更多。我只需要选择与字段中的这些记录匹配的记录。假设有人发送 1, 3 并且它必须存在于过滤器字段中,即和操作。
我正在使用 FIND_IN_SET 并且它对于单个值工作正常,假设有人发送 1 并且它正在获取正确的记录,但如果有人发送逗号分隔的 1,3 那么它会给出以下错误
Invalid query: Incorrect parameter count in the call to native function 'FIND_IN_SET'
对于单个记录,我正在使用以下查询,它工作正常。
SELECT shoptitle,
logopic,
complocality,
profileurl,
lat,
lng,
mageuserid,
compdesi,
deliverymin,
deleiveryprice,
deleiverymethod,
vendorphone,
compcity,
compstate,
zipcode,
showcompleteaddress,
( 3959 * acos( cos( radians('33.8352932') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('-117.91450359999999') ) + sin( radians('33.8352932') ) * sin( radians( lat ) ) ) ) AS distance
FROM userdata
WHERE FIND_IN_SET (1,filter)
HAVING distance < '10'
ORDER BY distance
最佳答案
最好的解决方案是标准化数据库,删除逗号分隔的值列表。这些问题是很难检查多个值(正如您所发现的),但即使对于单个值,任何检查也不会使用索引,因此速度会很慢。
如果失败,您需要拆分列表进行检查,然后对每个列表使用 FIND_IN_SET 来检查它是否在字段中。
类似这样的:-
$some_values = "1,3";
$some_values_array = explode(',', $some_values);
$Some_checks = "FIND_IN_SET ('".implode("',filter) AND FIND_IN_SET ('", $some_values_array).")";
$sql = "SELECT shoptitle,
logopic,
complocality,
profileurl,
lat,
lng,
mageuserid,
compdesi,
deliverymin,
deleiveryprice,
deleiverymethod,
vendorphone,
compcity,
compstate,
zipcode,
showcompleteaddress,
( 3959 * acos( cos( radians('33.8352932') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('-117.91450359999999') ) + sin( radians('33.8352932') ) * sin( radians( lat ) ) ) ) AS distance
FROM userdata
WHERE $Some_checks
HAVING distance < '10'
ORDER BY distance";
严格来说,可以在 SQL 中执行此操作,但它会非常糟糕且难以维护,而且速度也较慢。
关于php - 检查 PHP mysql 查询字段中的逗号分隔值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26840504/