MySQL – Как выбрать строки, в которых значение находится в массиве?

Хорошо, обычно я знаю, что вы бы сделали что-то вроде этого, вы знали значения массива:

SELECT * WHERE id IN (1,2,3) 

Но … Я не знаю значение массива, я просто знаю значение, которое я хочу найти в «сохраненном» массиве:

 SELECT * WHERE 3 IN (ids) // Where ids is stored as 1,2,3 

Что не работает. Есть ли другой способ сделать это?

Solutions Collecting From Web of "MySQL – Как выбрать строки, в которых значение находится в массиве?"

Используйте функцию 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) . "') " }