Ответ 1
Используйте функцию FIND_IN_SET:
SELECT t.*
FROM YOUR_TABLE t
WHERE FIND_IN_SET(3, t.ids) > 0
Хорошо, обычно я знаю, что вы бы сделали что-то вроде этого, вы знали значения массива:
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" только в них, а не те, что у других
Итак, если record1 является (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) . "') "
}