Помощник
|
Поиск в mysql при сохранении в ячейку массива |
Mstitel_mw
|
Сообщение
#1
|
||
|
|
||
|
|||
isvetlichniy |
21.8.2013, 12:50;
Ответить: isvetlichniy
Сообщение
#2
|
|
"|1|4|15|3|9|21|78|11|45" - это все хранится в одном поле? если да - то надо тогда делать поиск по этому полю, например вот так LIKE '%|15|%'
|
|
|
Mstitel_mw
|
Сообщение
#3
|
|
"|1|4|15|3|9|21|78|11|45" - это все хранится в одном поле? если да - то надо тогда делать поиск по этому полю, например вот так LIKE '%|15|%' в одном поле, а если просто %15% сработает? потому как к примеру крайнее число без "|" этого символа.. и непонятно правда как в таком случае будет еще искать к примеру с ид 1, ведь будут еще 11,12 и т.д., скорее всего их также найдет.. или нет? |
|
|
fedornabilkin |
21.8.2013, 13:30;
Ответить: fedornabilkin
Сообщение
#4
|
|
Это идентификаторы групп Никак не пойму, пользователь что ли сразу к нескольким группам принадлежит? Мне кажется надо бы как-то иначе это реализовать. |
|
|
matroskin8 |
21.8.2013, 13:45;
Ответить: matroskin8
Сообщение
#5
|
|
Никак не пойму, пользователь что ли сразу к нескольким группам принадлежит? Мне кажется надо бы как-то иначе это реализовать. Да, вполне может быть и такое. На движке этого форума, кстати, реализовано примерно также, только номера там разделены запятыми. Ну и если уж искать номера групп, то конечно же не 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
|
|
|
fedornabilkin |
21.8.2013, 13:55;
Ответить: fedornabilkin
Сообщение
#6
|
|
Например, создал бы таблицу принадлежности пользователя к группам Вот и я больше к такому варианту склоняюсь. Но ведь все зависит от обстоятельств. |
|
|
Mstitel_mw
|
Сообщение
#7
|
|
Тут рациональнее тогда использовать полнотекстовый поиск, который найдет точное совпадение и отработает гораздо быстрее. Хотя нужно учитывать еще и тот факт, что полнотекстовый поиск на небольших массивах данных может выдавать неожиданный результат. Ну и я бы все же реализовал несколько иначе. Например, создал бы таблицу принадлежности пользователя к группам. И для данного конкретного пользователя в этой таблице было бы 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? Палочку то эту в конце не проблема поставить.. |
|
|
matroskin8 |
21.8.2013, 15:08;
Ответить: matroskin8
Сообщение
#8
|
|
полнотекстовый поиск он ограничивается в количестве минимальных символов, по умолчанию там в 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 методично переберет каждую запись из миллиона. |
|
|
Mstitel_mw
|
Сообщение
#9
|
|
Логично... именно поэтому я упомянул о нюансах работы с полнотекстовым поиском. А зачем здесь цикл? Все можно вставить одним запросом: 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|%' ? норм искать будет? |
|
|
matroskin8 |
21.8.2013, 15:47;
Ответить: matroskin8
Сообщение
#10
|
|
если у нас записей миллион, то в таблице с группами во сколько раз больше записей будет? Мне кажется мы о разных вещах говорим... в таблице с группами будет ровно столько, сколько групп имеется. Речь идет о таблице связей, в которой указано, к каким группам относится юзер... т.е. там будет ID группы и ID юзера. В ней может быть хоть 10 миллионов записей, но если она использует индекс, то поиск по ним будет очень быстрым. Но если используется LIKE, то чем больше записей в этой таблице, тем более неэффективен будет LIKE. Но если таблица небольшая (скажем, несколько тысяч... тут уже смотрим на производительность), то вполне можно обойтись и LIKE'ом. |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Мегамаркет. Скидка 1000 рублей при покупке от 5000 рублей на все, на первый заказ. Мегамаркет. Скидка 1000 рублей при покупке от 5000 рублей на все, на п |
6 | stu999 | 1551 | 21.3.2024, 20:45 автор: stu999 |
|
Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery Разработка сайтов и сервисов под-ключ |
0 | alexey | 1168 | 24.11.2023, 14:46 автор: alexey |
|
Получил странную ссылку при линкбилдинге Как поведет себя поиск при обнаружении странной ссылке? |
10 | r0mZet | 2178 | 24.10.2022, 19:23 автор: Wachowski |
|
300 площадок под вечные ссылки на выбор: ТИЦ 20-9400, PR 0-6, ЯК, DMOZ. Скидки при пакетном заказе! | 65 | inkon | 30255 | 19.7.2022, 13:41 автор: Funoman |
|
тИЦ отменили! Новый показатель Яндекса ИКС! Лучшие площадки под размещение. Бесплатное написание статей при любом заказе. Эксклюзивное предложение. Успей получить написание статей БЕСПЛАТНО |
71 | VIMstat | 78308 | 21.6.2022, 9:38 автор: VIMstat |
Текстовая версия | Сейчас: 28.3.2024, 14:59 |