[英]Check Comma Seperated Values in field PHP mysql query
我在一個名為filter的表中有一個字段,它可以有逗號分隔的值1,2,3或3,1或更大,我只需要選擇與字段中的這些記錄匹配的那些記錄,假設有人發送1,3並且必須存在於過濾器領域,即和操作。
我正在使用FIND_IN_SET並且對於單個值工作正常,假設有人發送1並且正在獲取正確的記錄,但是如果有人發送逗號分隔了1,3,則給出以下錯誤
查詢無效:對本地函數“ 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
您必須使用以下代碼檢查字符串是否包含逗號
sqlvalue="1,2,3,4";
$HiddenProducts = explode(',',$sqlvalue);
if (in_array(1, $HiddenProducts)) {
echo "Available";
}
if (in_array(3, $HiddenProducts)) {
echo "available";
}
最好的解決方案是規范化數據庫,刪除用逗號分隔的值列表。 這些問題是,很難檢查多個值(如您所發現的),但是即使對於單個值,任何檢查都不會使用索引,因此會很慢。
如果沒有需要將列表拆分以進行檢查,然后對每個列表使用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中執行此操作,但是這樣做非常恐怖,難以維護,同時速度也較慢。
就我而言,我做了以下解決方案:
$filter = '1,2,3,4,5';
$newbreak = explode(",",$filter);
$checksize = sizeof($newbreak);
if ($checksize == 2)
{
$new = "FIND_IN_SET (".$newbreak[0].",filter) AND FIND_IN_SET (".$newbreak[1].",filter)";
}elseif($checksize == 3)
{
$new = "FIND_IN_SET (".$newbreak[0].",filter) AND FIND_IN_SET (".$newbreak[1].",filter) AND FIND_IN_SET (".$newbreak[2].",filter)";
}
elseif($checksize == 4)
{
$new = "FIND_IN_SET (".$newbreak[0].",filter) AND FIND_IN_SET (".$newbreak[1].",filter) AND FIND_IN_SET (".$newbreak[2].",filter) AND FIND_IN_SET (".$newbreak[3].",filter)";
}
elseif($checksize == 5)
{
$new = "FIND_IN_SET (".$newbreak[0].",filter) AND FIND_IN_SET (".$newbreak[1].",filter) AND FIND_IN_SET (".$newbreak[2].",filter) AND FIND_IN_SET (".$newbreak[3].",filter) AND FIND_IN_SET (".$newbreak[5].",filter) ";
}else
{
}
$query =
sprintf("SELECT * ,( 3959 * acos( cos( radians('%s') ) *
cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') )
* sin( radians( lat ) ) ) ) AS distance FROM userdata WHERE
$new HAVING distance < '%s' ORDER BY distance",
mysql_real_escape_string($center_lat),
mysql_real_escape_string($center_lng),
mysql_real_escape_string($center_lat),
mysql_real_escape_string($radius));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.