PHP MySQL Поиск нескольких значений в одном поле - PullRequest
2 голосов
/ 17 декабря 2010

Как я могу сохранить несколько значений в одном поле 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, поэтому я знаю, что могу сериализовать данные при их вводе, затем десериализовать и выполнить поиск в результирующем массиве, но набор данных довольно большой, так что это будет довольномедленный запрос, так как мне придется получить весь набор данных и перебрать полученный массив.

Есть что-то, что я, возможно, пропустил?Я действительно не хочу создавать таблицу для каждого из возможных вариантов, так как в каждом из них есть множество групп и множество вариантов.

Есть идеи?Заранее спасибо

РЕДАКТИРОВАТЬ: Приведенный выше пример является просто примером, может быть любое количество 'nums'

Ответы [ 4 ]

3 голосов
/ 17 декабря 2010

Для оптимальной скорости и эффективности, поместите 'nums' в отдельную таблицу, связанную с идентификаторами.

Использование LIKE также будет работать, однако также необходимо выполнить сравнение с деталью.строки.В зависимости от размера вашего набора данных это также может занять некоторое время.

Другой вариант - 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#)
2 голосов
/ 17 декабря 2010

Вы должны сделать это следующим образом:

Создать запись для каждой комбинации:

John | 21
John | 22
John | 23
Mark | 19
Mark | 22

Если у вас есть дополнительная информация в таблице, создайте 2 таблицы:

Users:
UserId |FirstName |Lastname
1      |John      |Doe
2      |Mark      |Hamill

   Options:
    UserId |Num
          1| 21
          1| 22
          1| 23
          2| 19
          2| 22

Если вам нужно придерживаться существующей структуры базы данных только с одним столбцом, вы можете сохранить его как текст / varchar.просто поставьте трубу (или любой другой символ) в начале вашей строки и после каждого числа | 21 | 21 | 23 |.Затем вы можете искать с помощью LIKE '% | 23 |%'

Это медленно и безобразно, как черт, но иногда добавление таблиц или aolums не вариант.

0 голосов
/ 06 февраля 2013

ВЫБРАТЬ имя, GROUP_CONCAT (num) FROM table_name GROUP BY name

0 голосов
/ 17 декабря 2010

Имя в num pivot table, вероятно, самый элегантный способ сделать это

...