Це здається дуже простим питанням, але воно викликає у мене смішний головний біль.
Ось мій запит: SELECT * FROM table WHERE id IN ($list);
Скажімо, цей список: 1,2,3,4,5,6
При першому виконанні запиту він чудово працює, отримує запитані рядки. Потім я видаляю одне значення: 1,2,4,5,6
Раптом запит нічого не отримує.
Я лунаю $list
і $list
відображається 1,2,4,5,6
Я замінюю IN ($list)
з IN (1,2,4,5,6)
і вона прекрасно працює.
Що мені не вистачає?
Ось код, який видаляє одне значення:
function removeFromList($id, $list){
$ider = ",".$id.",";
if($list[strlen($list)-1] == ","){
if($list[0] != ","){
$list = ",".$list;
}
$list = str_replace($ider, ",", $list);
if($list[strlen($list)-1] == ","){
$list[strlen($list)-1] = "";
}
if($list[0] == ","){
$list[0] = "";
}
} else {
if($list[0] != ","){
$list = ",".$list;
}
$list = $list.",";
$list = str_replace($ider, ",", $list);
if($list[strlen($list)-1] == ","){
$list[strlen($list)-1] = "";
}
if($list[0] == ","){
$list[0] = "";
}
}
return $list;
}
Відповіді:
0 для відповіді № 1What happens if you change your query to this
SELECT * FROM table WHERE id IN ("$list");
0 для відповіді № 2
Ви хочете використовувати find_in_set()
:
SELECT * FROM table WHERE find_in_set(id, $list)
В in
твердження, що список представляє сингл вартість 1,2,3,4,5
.
Альтернативою є створення оператора SQL зі списком у ньому безпосередньо:
"SELECT * FROM table WHERE id in (".$list.")"
Це більш ефективно в тому сенсі, що запит може скористатися перевагами індексу id
.