PHP, MySQL: MySQL заменяет функцию php in_array - PullRequest
3 голосов
/ 05 июня 2010

Скажите, если у меня есть массив, и я хочу проверить, является ли элемент частью этого массива, я могу пойти дальше и использовать in_array (needle, haystack) для определения результатов. Я пытаюсь увидеть PHP-эквивалент этого для моих целей. Теперь у вас может быть мгновенный ответ для меня, и у вас может возникнуть соблазн сказать «Используйте IN». Да, я могу использовать IN, но это не приводит к желаемым результатам. Позвольте мне объяснить на примере:

У меня есть столбец с именем "домашние животные" в таблице БД. Для записи, он имеет значение: Кошка, собака, верблюд (Да, данные столбца - это значения, разделенные запятыми). Учтите, что этот ряд имеет идентификатор 1.

Теперь у меня есть форма, в которой я могу ввести значение в форме ввода и использовать это значение для проверки значения в БД. Допустим, я ввел следующее значение через запятую в форме ввода: CAT, верблюд (да, CAT является заглавной и преднамеренной, поскольку некоторые пользователи, как правило, вводят ее таким образом).

Теперь, когда я ввожу вышеуказанную информацию в форму ввода и отправляю, я могу собрать информацию POST и использовать следующий запрос:

$search = $_POST['pets'];
$sql = "SELECT id FROM table WHERE pets IN ('$search') "; 
  1. Приведенный выше запрос не возвращает мне строку, которая уже существует в БД (помните запись, в которой Кошка, собака, Верблюд в качестве значения для столбца домашних животных?). Я пытаюсь заставить записи выступать в качестве надмножества, а значения из формы ввода - как подмножества. Поэтому в этом случае я ожидаю, что значение id будет отображаться, поскольку значения существуют в столбце, но это не происходит.

  2. Теперь скажите, если я введу просто CAT в качестве ввода формы и выполню поиск, он должен показать мне строку ID 1.

  3. Теперь скажите, если я введу просто верблюд, cAT в качестве ввода формы и выполню поиск, он должен показать мне строку ID 1.

Как я могу достичь вышеуказанного?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 06 июня 2010

Функция, которую вы ищете: find_in_set :

 select * from ... where find_in_set($word, pets)

для запросов из нескольких слов вам нужно проверить каждое слово и И (или ИЛИ) тесты:

  where find_in_set($word1, pets) AND find_in_set($word2, pets) etc 
4 голосов
/ 23 марта 2013

IN () Проверьте, находится ли значение в наборе значений

mysql> SELECT 2 IN (0,3,5,7);
        -> 0
mysql> SELECT 'wefwf' IN ('wee','wefwf','weg');
        -> 1

SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');

Просмотр: IN MySql

2 голосов
/ 05 июня 2010

У меня есть несколько вещей для вас с точки зрения обратной связи и прямого ответа на ваши вопросы:

Во-первых, я предлагаю вам санировать входные данные.Все скажут тебе это.Для этого см. Какой самый лучший метод для очистки ввода пользователя с помощью PHP? .

Во-вторых, нормализуйте ввод с помощью UPPER () или LOWER (), если вы хотите использовать MySQL и вам нужно хранить отформатированные пользователем данные, или использовать strtoupper () и strtolower (), если вы хотите обработать вводперед сохранением.

Вы по-прежнему остаетесь с порядком в запросе пользователя.Например, "кошка, собака" должна дать тот же результат, что и "собака, кошка".Если вы закодируете это с помощью оператора LIKE, проблемы с производительностью сожрут вас живьем.Вам придется не только создавать запрос динамически, но и получать огромные и излишне сложные запросы.Короче, забудь об этом.У вас есть , чтобы изменить способ хранения ваших данных.

Один из способов сделать это - создать таблицу отношений, которая ссылается на таблицу уникальных пользовательских данных и вашу запись.Эта таблица будет выглядеть примерно так:

user_id | pet_id

С каждым пользователем может быть связано более одного pet_id.Я создал базу данных давным-давно, так же, как вы, и столкнулся с теми же проблемами.С точки зрения производительности это никогда не окупается, и это совсем не хороший стиль.Из-за этого я сменил структуру на вышеупомянутый метод.

0 голосов
/ 08 сентября 2017

Эта функция mysql ищет значение INT в массиве json INT:

- ПРИМЕРЫ:

- select is_into_json_array (18, '[25, 10, 15]');-> -100
- выбрать is_into_json_array (25, '[25, 10, 15]');-> 0
- выбрать is_into_json_array (15, '[25, 10, 15]');-> 2

https://github.com/PietroLaGrotta/Json-in-mysql-text-type/blob/master/is_into_json_in_array.sql

0 голосов
/ 05 июня 2010

Да, данные столбца - запятая разделенное значение

Вот ваша вина.
Нет, это не должно быть запятым
И ваша база данных должна быть нормализована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...