php. Несколько групп для пользователя. Сложности в поиске по mysql.

R
На сайте с 18.12.2009
Offline
92
597

Приветствую. В базе, условно, есть 2 таблицы: `users` и `groups`

Каждому пользователю можно присвоить идентификатор группы. Все просто, далее ищем так:

"SELECT * FROM `users` WHERE `group_id` = " . (int) $group

Возникла задача сделать возможность присваивать одному пользователю несколько групп.

И тут возникает 2 вопроса:

1) Как хранить значения в базе? JSON, просто строкой через запятую и т.п? Например, для пользователя `group_id` уже будет содержать поле не INT, а строковое.

2) Как искать? (WHERE `group_id` = ) уже не подойдет. Как это реализуется? Вижу эту возможность во многих ресурсах, но столкнулся с реализацией впервые. Решить могу, не не уверен, что сделаю лучшим способом, так как искать по базе методом ( WHERE `group_id` LIKE '%...%') кажется не правильным.

siv1987
На сайте с 02.04.2009
Offline
427
#1

Обычно делают через запятую. Поиск делается через регулярное выражение:

group_id REGEXP '[[:<:]](1|2|3)[[:>:]]'

---------- Добавлено 02.05.2013 в 18:39 ----------

rerighter:
Например, для пользователя `group_id` уже будет содержать поле не INT, а строковое.

group_id оставить как основное, а для дополнительных групп внести новое поле.

---------- Добавлено 02.05.2013 в 18:47 ----------

rerighter:
Поиск делается через регулярное выражение

или LIKE-ом, но запятые нужно расставить оп определенному формату ,1,3,4, - LIKE "%,1,%"

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#2

Я думал что мускул это реляционная БД:)

Не надо ничего мудрить! Делайте новую запись.

Пусть юзер номер 12 состоит в группах 3, 5, и 42

То делаем 3 записи в БД:

`userID` - `groupsID`

12 - 3

12 - 5

12 - 42

На большой БД при WHERE спасут индексы, для LIKE и REGEXP они не помогут.

Подпись))
izbushka
На сайте с 08.06.2007
Offline
110
#3

Правильно создать еще одну таблицу:

user_id | group_id

Оба поля целые. Если у юзера несколько групп - будет несколько записей в этой таблице.

Искать по этой таблице с join'ом users

Милованов Ю.С, опередил :)

LovelAss
На сайте с 05.06.2009
Offline
96
#4
дани мапов
На сайте с 06.09.2012
Offline
204
#5

Сколько вообще записей ожидается в таблице? Можно выбрать нужный способ, исходя из этого.

Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
R
На сайте с 18.12.2009
Offline
92
#6

Милованов Ю.С, большое спасибо. Странно, что я сам не додумался. Правильно говорят - "Все гениальное просто (с)".

дани мапов, система будет универсальной и использоваться под разные нужны, так что способ предложенный izbushka и Милованов Ю.С самый подходящий. Как было верно подмечено:

мускул это реляционная БД
siv1987
На сайте с 02.04.2009
Offline
427
#7
rerighter:
Как было верно подмечено:

Главное при этом не забывайте об избыточности данных. Тут как минимум нужно будет создать три поля (если не хотите использовать составной первичный ключ) + индексы. Если все это ради одного двух запросов, которые притом выполняются из админ части...

Милованов Ю.С:
для LIKE и REGEXP они не помогут.

на 300К записей запрос с LIKE по такой строке у меня выполняется не больше секунды.

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#8
siv1987:
Главное при этом не забывайте об избыточности данных. Тут как минимум нужно будет создать три поля (если не хотите использовать составной первичный ключ) + индексы. Если все это ради одного двух запросов, которые притом выполняются из админ части...


на 300К записей запрос с LIKE по такой строке у меня выполняется не больше секунды.

А может ТС 2-ой ВК делает:D

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий