X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Поиск в mysql при сохранении в ячейку массива
Mstitel_mw
Mstitel_mw
Topic Starter сообщение 21.8.2013, 8:30; Ответить: Mstitel_mw
Сообщение #1


В таблице с пользователями хранится запись вида "|1|4|15|3|9|21|78|11|45". Это идентификаторы групп. Каким образом в группе к примеру с ид 15 вывести пользователей у которых присутствует этот ид в поле?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
isvetlichniy
isvetlichniy
сообщение 21.8.2013, 12:50; Ответить: isvetlichniy
Сообщение #2


"|1|4|15|3|9|21|78|11|45" - это все хранится в одном поле? если да - то надо тогда делать поиск по этому полю, например вот так LIKE '%|15|%'
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mstitel_mw
Mstitel_mw
Topic Starter сообщение 21.8.2013, 13:14; Ответить: Mstitel_mw
Сообщение #3


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


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

и непонятно правда как в таком случае будет еще искать к примеру с ид 1, ведь будут еще 11,12 и т.д., скорее всего их также найдет.. или нет?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
fedornabilkin
fedornabilkin
сообщение 21.8.2013, 13:30; Ответить: fedornabilkin
Сообщение #4


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

Никак не пойму, пользователь что ли сразу к нескольким группам принадлежит?
Мне кажется надо бы как-то иначе это реализовать.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
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
fedornabilkin
сообщение 21.8.2013, 13:55; Ответить: fedornabilkin
Сообщение #6


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

Вот и я больше к такому варианту склоняюсь. Но ведь все зависит от обстоятельств.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mstitel_mw
Mstitel_mw
Topic Starter сообщение 21.8.2013, 14:17; Ответить: 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
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
Mstitel_mw
Topic Starter сообщение 21.8.2013, 15:25; Ответить: 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
matroskin8
сообщение 21.8.2013, 15:47; Ответить: matroskin8
Сообщение #10


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

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


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Мегамаркет. Скидка 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


 



RSS Текстовая версия Сейчас: 28.3.2024, 14:59
Дизайн