Вопрос

Как я могу сохранить несколько значений в одном поле 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 по имени

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top