Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

Поиск в mysql при сохранении в ячейку массива

#1 Mstitel

Mstitel
  • Пользователь
  • 6 сообщений
  • Репутация: 0
0

Отправлено 21 Август 2013 - 07:30

В таблице с пользователями хранится запись вида "|1|4|15|3|9|21|78|11|45". Это идентификаторы групп. Каким образом в группе к примеру с ид 15 вывести пользователей у которых присутствует этот ид в поле?

 

 

  • 0

#2 isvetlichniy

isvetlichniy
  • Пользователь
  • 619 сообщений
  • Репутация: 93

Отправлено 21 Август 2013 - 11:50

"|1|4|15|3|9|21|78|11|45" - это все хранится в одном поле? если да - то надо тогда делать поиск по этому полю, например вот так LIKE '%|15|%'
  • 0

#3 Mstitel

Mstitel
    Topic Starter
  • Пользователь
  • 6 сообщений
  • Репутация: 0

Отправлено 21 Август 2013 - 12:14

"|1|4|15|3|9|21|78|11|45" - это все хранится в одном поле? если да - то надо тогда делать поиск по этому полю, например вот так LIKE '%|15|%'


в одном поле, а если просто %15% сработает? потому как к примеру крайнее число без "|" этого символа..

и непонятно правда как в таком случае будет еще искать к примеру с ид 1, ведь будут еще 11,12 и т.д., скорее всего их также найдет.. или нет?
  • 0

#4 fedornabilkin

fedornabilkin
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 21 Август 2013 - 12:30

Это идентификаторы групп

Никак не пойму, пользователь что ли сразу к нескольким группам принадлежит?
Мне кажется надо бы как-то иначе это реализовать.
  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#5 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 21 Август 2013 - 12:45

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

Да, вполне может быть и такое. На движке этого форума, кстати, реализовано примерно также, только номера там разделены запятыми. Ну и если уж искать номера групп, то конечно же не LIKE'ом, поскольку он найдет не точные, а подобные совпадения, например если попытаться найти в данном конкретном случае группу 5, то ее здесь нет, но тем не менее поиск даст результат, поскольку есть подобные группы 15 и 45. Тут рациональнее тогда использовать полнотекстовый поиск, который найдет точное совпадение и отработает гораздо быстрее. Хотя нужно учитывать еще и тот факт, что полнотекстовый поиск на небольших массивах данных может выдавать неожиданный результат.
Ну и я бы все же реализовал несколько иначе. Например, создал бы таблицу принадлежности пользователя к группам. И для данного конкретного пользователя в этой таблице было бы 9 записей:
id | user_id | group_id |
1  | 1	   | 1		  |
2  | 1	   | 4		  |
...
И таким образом решается все банальным запросом:
SELECT user_id FROM tbl_name WHERE group_id = 4; -- выбираем всех юзеров группы 4

  • 0


#6 fedornabilkin

fedornabilkin
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 21 Август 2013 - 12:55

Например, создал бы таблицу принадлежности пользователя к группам

Вот и я больше к такому варианту склоняюсь. Но ведь все зависит от обстоятельств.
  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#7 Mstitel

Mstitel
    Topic Starter
  • Пользователь
  • 6 сообщений
  • Репутация: 0

Отправлено 21 Август 2013 - 13:17

Тут рациональнее тогда использовать полнотекстовый поиск, который найдет точное совпадение и отработает гораздо быстрее. Хотя нужно учитывать еще и тот факт, что полнотекстовый поиск на небольших массивах данных может выдавать неожиданный результат.
Ну и я бы все же реализовал несколько иначе. Например, создал бы таблицу принадлежности пользователя к группам. И для данного конкретного пользователя в этой таблице было бы 9 записей:

id | user_id | group_id |
1  | 1	   | 1		  |
2  | 1	   | 4		  |
...
И таким образом решается все банальным запросом:
SELECT user_id FROM tbl_name WHERE group_id = 4; -- выбираем всех юзеров группы 4



полнотекстовый поиск он ограничивается в количестве минимальных символов, по умолчанию там в 4 знака стоит, я минимум до 2 доводил, с 1 знаком не работает.

с такой таблицей проще выводить, не спорю, но это будет намного больше запросов при одном действии. Лепить цикл, перебирая все ид групп. То массивом забухал туда и готово.

А если вот все же сделать как LIKE '%|15|%' тогда то норм будет искать с ид к примеру 1 там или 5? Палочку то эту в конце не проблема поставить..
  • 0

#8 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 21 Август 2013 - 14:08

полнотекстовый поиск он ограничивается в количестве минимальных символов, по умолчанию там в 4 знака стоит, я минимум до 2 доводил, с 1 знаком не работает.

Логично... именно поэтому я упомянул о нюансах работы с полнотекстовым поиском.

с такой таблицей проще выводить, не спорю, но это будет намного больше запросов при одном действии. Лепить цикл, перебирая все ид групп.

А зачем здесь цикл? Все можно вставить одним запросом:
INSERT INTO tbl_name (group_id, user_user_id) VALUES(1,1),(4,1),(15,1),(3,1),(9,1),(21,1),(78,1),(11,1),(45,1); -- 1 запросом добавим 9 записей
Достается все также одним запросом.
Как по мне, то этот вариант получше LIKE'a будет, который на больших массивах данных уже будет отрабатывать долго, поскольку индексов не использует, а перебирает записи одну за другой в поисках искомого в тексте... и даже если ни одного пользователя указанной группы нет, а записей у нас миллион, то LIKE методично переберет каждую запись из миллиона.
  • 0


#9 Mstitel

Mstitel
    Topic Starter
  • Пользователь
  • 6 сообщений
  • Репутация: 0

Отправлено 21 Август 2013 - 14:25

Логично... именно поэтому я упомянул о нюансах работы с полнотекстовым поиском.

А зачем здесь цикл? Все можно вставить одним запросом:

INSERT INTO tbl_name (group_id, user_user_id) VALUES(1,1),(4,1),(15,1),(3,1),(9,1),(21,1),(78,1),(11,1),(45,1); -- 1 запросом добавим 9 записей
Достается все также одним запросом.
Как по мне, то этот вариант получше LIKE'a будет, который на больших массивах данных уже будет отрабатывать долго, поскольку индексов не использует, а перебирает записи одну за другой в поисках искомого в тексте... и даже если ни одного пользователя указанной группы нет, а записей у нас миллион, то LIKE методично переберет каждую запись из миллиона.


если у нас записей миллион, то в таблице с группами во сколько раз больше записей будет? + еще постоянно там необходимо вносить корректировки относительно того в каких группах юзер, не так часто, но все же..

Так что по поводу LIKE '%|15|%' ?
норм искать будет?
  • 0

#10 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 21 Август 2013 - 14:47

если у нас записей миллион, то в таблице с группами во сколько раз больше записей будет?

Мне кажется мы о разных вещах говорим... в таблице с группами будет ровно столько, сколько групп имеется.
Речь идет о таблице связей, в которой указано, к каким группам относится юзер... т.е. там будет ID группы и ID юзера. В ней может быть хоть 10 миллионов записей, но если она использует индекс, то поиск по ним будет очень быстрым. Но если используется LIKE, то чем больше записей в этой таблице, тем более неэффективен будет LIKE.
Но если таблица небольшая (скажем, несколько тысяч... тут уже смотрим на производительность), то вполне можно обойтись и LIKE'ом.
  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru