Хорошо, обычно я знаю, что вы бы сделали что-то вроде этого, вы знали значения массива:
SELECT * WHERE id IN (1,2,3)
Но … Я не знаю значение массива, я просто знаю значение, которое я хочу найти в «сохраненном» массиве:
SELECT * WHERE 3 IN (ids) // Where ids is stored as 1,2,3
Что не работает. Есть ли другой способ сделать это?
Используйте функцию FIND_IN_SET :
SELECT t.* FROM YOUR_TABLE t WHERE FIND_IN_SET(3, t.ids) > 0
К тому времени, когда запрос попадет на SQL, вы должны уже расширить список. Легкий способ сделать это, если вы используете идентификаторы из какого-то внутреннего надежного источника данных, где вы можете быть на 100% уверены, что они целые (например, если вы выбрали их из своей базы данных раньше):
$sql = 'SELECT * WHERE id IN (' . implode(',', $ids) . ')';
Если ваши данные поступают от пользователя, вам нужно убедиться, что вы получаете только целые значения, возможно, наиболее легко:
$sql = 'SELECT * WHERE id IN (' . implode(',', array_map('intval', $ids)) . ')';
Если вы используете функцию FIND_IN_SET
:
FIND_IN_SET(a, columnname)
дает все записи, которые имеют «a» в них, отдельно или с другими
А ТАКЖЕ
FIND_IN_SET(columnname, a)
дает только записи, которые имеют «a» только в них, а не те, что у других
Поэтому, если запись 1 является (a, b, c), а record2 является (a)
FIND_IN_SET(columnname, a)
дает только запись2, тогда как FIND_IN_SET(a, columnname)
дает обе записи.
Если элемент массива не является целым числом, вы можете использовать следующее:
$skus = array('LDRES10','LDRES12','LDRES11'); //sample data if(!empty($skus)){ $sql = "SELECT * FROM `products` WHERE `prodCode` IN ('" . implode("','", $skus) . "') " }