У меня есть таблица sql под названием «Offres»
внутри этой таблицы столбец с именем «регионы» имеет в нем массив (value1, value2, value3, …)
строка1: "35,2,15,69,98"
строка2: "7,9,15,5,69"
строка 3: "7,3,45,5,6"
как я могу искать строки, которые имеют несколько значений за одно и то же время
для exp: я хочу искать строки, в которых есть 15,69
результат должен отображать строки1 и строку2
благодаря
для exp: я хочу искать строки, в которых есть 15,69
если вы можете добавить пробелы до и после ваших значений, тогда это может быть легко проверить скрипку
как
row1 :' 690 , 6969 , 069 , 69069 ' row2 :' 69 , 69 , 69 , 69 , 69 ' row3 :' 6969 , 69 , 69069 ' row4 :' 069 , 69069 ' row5 :' 69 ' SELECT * FROM Offres WHERE regions LIKE regions LIKE '% 69 %';
Как видите, это приведет только к проблемам. Сначала сначала нормализуйте структуру БД
Offers id region 1 35 1 2 1 15 ... 2 7 2 9 2 15 ...
Если вы хотите, чтобы поле было доступно для поиска через SQL, сохраните его как несколько строк и не сериализуйте его.
Если по каким-то причинам вам придется, вы можете извлечь каждую строку, десериализовать ее (для вашего случая, с explode()
и соответствовать ей в отдельности, что требует большой вычислительной мощности.
Вы можете искать элементы в таких списках с помощью FIND_IN_SET (). Если вам нужно найти несколько записей в строках, вам нужно несколько выборок.
Но: Хорошие структуры баз данных избежали бы всего этого и имели бы только одну запись за строку вместо списков
Ради полноты я отправляю это как ответ тоже, поэтому он не заблуждается в огромной дискуссии в комментариях;)
Прежде всего, если вы хотите иметь несколько значений в одном столбце SQL, то столбец set – это путь. См. Например, здесь и здесь . Но если вы абсолютно не можете обойтись с несколькими значениями в одном столбце, и вы можете гарантировать, что они всегда будут встречаться в одном шаблоне (разделенные запятыми, без пробелов), тогда вы можете искать строки, содержащие 2 определенных таких значения, которые вы можете сделайте это так (согласно вашему примеру)
SELECT * FROM Offres WHERE ( regions = '15' /*value is the only one in that row, obviously this is not necessary if you look for 2 values at once, but if you would only look for one value at once you MUST include it ;)*/ OR regions LIKE '%,15' /*value is the last value in that row*/ OR regions LIKE '15,%' /*value is the first value in that row*/ OR regions LIKE '%,15,%' /*value is a value somewhere in between other values in that row*/ ) AND ( regions = '69' /*value is the only one in that row, obviously this is not necessary if you look for 2 values at once, but if you would only look for one value at once you MUST include it ;)*/ OR regions LIKE '%,69' /*value is the last value in that row*/ OR regions LIKE '69,%' /*value is the first value in that row*/ OR regions LIKE '%,69,%' /*value is a value somewhere in between other values in that row*/ )
Вы также можете попробовать это в этой скрипке .