PHP MySQL Ищу несколько значений в одном поле
-
11-10-2019 - |
Вопрос
Как я могу сохранить несколько значений в одном поле SQL а также Убедитесь, что эти данные доступны для поиска?
Например, я хочу иметь возможность сделать это
name | num
-----------
John | 21, 22, 34
Mike | 41, 32, 43
Dave | 12, 23, 34
$query = SELECT name from table WHERE num = '12'
// result should be 'Dave'
или же
$query = SELECT name from table WHERE num = '22' or num = 41
// result should be John and Mike
Я использую PHP, поэтому я знаю, что смогу сериализовать данные при их вводе, а затем не выносит поиск в полученном массиве, но набор данных довольно большой, так что это будет довольно медленный запрос, так как мне придется получить весь набор данных и и Перевернуть через результирующий массив.
Есть ли что -то, что я мог пропустить? Я действительно не хочу создавать таблицу для каждого из возможных вариантов, так как есть абсолютно множество групп и множество вариантов в каждом.
Любые идеи? заранее спасибо
РЕДАКТИРОВАТЬ: Приведенный выше пример является лишь примером, может быть любое количество «числа»
Решение
Вы должны сделать это таким образом:
Craete - запись для каждой комбинации:
John | 21
John | 22
John | 23
Mark | 19
Mark | 22
Если у вас есть какая -либо адеквальная информация в YouTable, создайте 2 таблицы:
Users:
UserId |FirstName |Lastname
1 |John |Doe
2 |Mark |Hamill
Options:
UserId |Num
1| 21
1| 22
1| 23
2| 19
2| 22
Если вам нужно придерживаться существующей структуры базы данныхТолько с одним столбцом вы можете хранить его в виде текста/варчара. Просто поместите трубу (или любой другой символ) в начале вашей строки и после каждого номера | 21 | 23 | 23 |. Тогда вы можете искать с помощью '%| 23 |%'
Это медленно и уродливо, как ад, но иногда добавление таблиц или аолум не является вариантом.
Другие советы
Для оптимальной скорости и эффективности поместите «числа» в отдельную таблицу, связывающую с идентификаторами.
С использованием КАК Будет работать тоже, однако, он также должен провести сравнение с частью строки. В зависимости от размера вашего набора данных это также может занять некоторое время.
Еще один вариант - MySQL Regex с использованием Границы слов т.е.:
SELECT name from table where nums REGEXP '[[:<:]]##[[:>:]]';
Каждый из этих вариантов будет работать, однако перемещение данных в отдельную таблицу является правильным методом, особенно если есть много возможностей.
Для этого метода вам понадобится три таблицы
People
-------
ID
NAME
Options
-------
ID
OPTION
Options_People
--------------
OPTION_ID
PEOPLE_ID
Чтобы получить всех «людей» с определенным вариантом, это:
SELECT p.* FROM People p, Options_People op
WHERE p.ID = op.PEOPLE_ID and OPTION_ID = #option#
Чтобы получить всех «людей» с любым из нескольких вариантов:
SELECT p.* FROM People p, Options_People op
WHERE p.ID = op.PEOPLE_ID and OPTION_ID IN ( #option1#,#option2#,#option#)
Имя для num pivot table, вероятно, является самым элегантным способом сделать это
Выберите имя, Group_Concat (num) из группы table_name по имени