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



Поиск в 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
  • Неактивные
  • 622 сообщений
  • Репутация: 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
  • Модератор
  • 1 191 сообщений
  • Репутация: 206

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

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

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

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#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
  • Модератор
  • 1 191 сообщений
  • Репутация: 206

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

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

Вот и я больше к такому варианту склоняюсь. Но ведь все зависит от обстоятельств.
  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#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


#11 Mstitel
Mstitel
    Topic Starter
  • Неактивные
  • 6 сообщений
  • Репутация: 0

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

Речь идет о таблице связей, в которой указано, к каким группам относится юзер... т.е. там будет ID группы и ID юзера. В ней может быть хоть 10 миллионов записей, но если она использует индекс, то поиск по ним будет очень быстрым.

Каким образом она использует индекс? я если делаю такие таблицы, то просто тупо три поля, индекс там у id у меня идет primary. Или еще туда можно какой индекс влепить?
  • 0

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

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

В MySQL кроме автоматического индекса (PRIMARY KEY), есть еще 3 индекса - UNIQUE, INDEX и FULLTEXT. Собственно, одноименный тип индекса - INDEX - здесь и можно использовать. Подробнее можно прочитать в документации:
Источник
Перевод
Позволю себе процитировать преимущества использования индексов из документации:

Без индекса чтение таблицы осуществляется по всей таблице начиная с первой записи, пока не будут найдены соответствующие строки. Чем больше таблица, тем больше накладные расходы. Если же таблица содержит индекс по рассматриваемым столбцам, то MySQL может быстро определить позицию для поиска в середине файла данных без просмотра всех данных. Для таблицы, содержащей 1000 строк, это будет как минимум в 100 раз быстрее по сравнению с последовательным перебором всех записей


  • 1


#13 Mstitel
Mstitel
    Topic Starter
  • Неактивные
  • 6 сообщений
  • Репутация: 0

Отправлено 21 августа 2013 - 15:20

Понятно. Спасибо всем за помощь, форум крутой тут!)
Неудобно только что количество сообщений на страницу нельзя настроить.
  • 0

#14 isvetlichniy
isvetlichniy
  • Неактивные
  • 622 сообщений
  • Репутация: 93

Отправлено 21 августа 2013 - 15:43

Так что по поводу LIKE '%|15|%' ?

нормально конечно будет
если просто Так что по поводу LIKE '%15%' то будет искать также вхождения типа |115| или |515|
  • 1

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


Похожие темы
  Название темы Автор Статистика Последнее сообщение

Пользователь месяца
Megoydagi Megoydagi 1-й за Август
Очков активности: 30 4 темы, 8 сообщений, 1 балл репутации
Сайт: bank.net.ru
ТОП самых активных за этот месяц
  • Фотография Vmir
    #1

    Vmir
    Очков активности: 22.5 3 темы, 6 сообщений, 1 балл репутации

  • Фотография BLIK
    #2

    BLIK
    Очков активности: 18 Вне конкурса за определение пользователя месяца

  • Фотография kuztoday
    #3

    kuztoday
    Очков активности: 10.5 1 тема, 4 сообщения, 1 балл репутации

  • Фотография SergiuS85
    #4

    SergiuS85
    Очков активности: 10.5 2 темы, 1 сообщение, 1 балл репутации

  • Фотография Megoydagi
    #5

    Megoydagi (bank.net.ru)
    Очков активности: 9 Вне конкурса за определение пользователя месяца

  • Фотография mkreine
    #6

    mkreine (analiz-krovi.net)
    Очков активности: 9 1 тема, 3 сообщения, 1 балл репутации

  • Фотография kolver
    #7

    kolver
    Очков активности: 9 1 тема, 3 сообщения, 1 балл репутации

  • Фотография wp01
    #8

    wp01
    Очков активности: 7.5 0 тем, 5 сообщений, 1 балл репутации

  • Фотография Totti
    #9

    Totti
    Очков активности: 7.5 0 тем, 5 сообщений, 1 балл репутации

  • Фотография fedornabilkin
    #10

    fedornabilkin (plohoneponyal.ru)
    Очков активности: 7.5 1 тема, 2 сообщения, 1 балл репутации

  • Показать весь ТОП 10

Поддержите форум! =)
Топ 5 участников по репутации

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