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

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

Так как предыдущая тема устарела и возможности разместить ответ в ней нет, создам новую.

Структура была построена, согласно предложенной схеме от Милованов Ю.С.

Т.е. есть 3 таблицы - пользователи (усл. `users`), группы (усл. `groups`) и таблица для связей ID первых двух (усл. `map`).

Сейчас база набилась данными, пока 35 000 строк. Появились проблемы. А именно, требуется оптимизация выборки пользователей по группе.

Прошу Вас помочь. Единственный вариант, который я вижу при такой реализации. Например, есть группа "Москва" с `id` = 2. Получается, первоначально я выбираю все `id` пользователей из общей таблицы со связями (`map`), у которых совпадает id группы.

Запрос: "SELECT `user_id` FROM `map` WHERE `group_id` = 2"

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

Запрос: "SELECT * FROM `users` WHERE `id` = 1 OR `id` = 2 ... (еще куча id из первого запроса) ... OR `id` = 15000"

Запрос просто огромный и ужасный. Может ответ прост, но пока не могу придумать оптимизацию выборки.

bay_ebook
На сайте с 28.05.2010
Offline
111
#1
rerighter:
Так как предыдущая тема устарела и возможности разместить ответ в ней нет, создам новую.

Структура была построена, согласно предложенной схеме от Милованов Ю.С.
Т.е. есть 3 таблицы - пользователи (усл. `users`), группы (усл. `groups`) и таблица для связей ID первых двух (усл. `map`).

Сейчас база набилась данными, пока 35 000 строк. Появились проблемы. А именно, требуется оптимизация выборки пользователей по группе.

Прошу Вас помочь. Единственный вариант, который я вижу при такой реализации. Например, есть группа "Москва" с `id` = 2. Получается, первоначально я выбираю все `id` пользователей из общей таблицы со связями (`map`), у которых совпадает id группы.
Запрос: "SELECT `user_id` FROM `map` WHERE `group_id` = 2"

На выходе я получаю большой список id пользователей, по которому, в дальнейшем я могу выбрать всех участников группы.
Запрос: "SELECT * FROM `users` WHERE `id` = 1 OR `id` = 2 ... (еще куча id из первого запроса) ... OR `id` = 15000"

Запрос просто огромный и ужасный. Может ответ прост, но пока не могу придумать оптимизацию выборки.

Есть такие вещи как join который поможет сделать с 2 запросов один.

А еще, на будущее, что бы не делать тучи OR юзаем IN

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
R
На сайте с 18.12.2009
Offline
92
#2

bay_ebook, благодарю! Все гениальное просто) Я почему-то не подумал про JOIN в принципе.

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

Да, и про индексы не забывайте.

D8
На сайте с 16.06.2007
Offline
74
dm8
#4

Джойн-то джойном, но мне не понравилась сама реляционная база.

R
На сайте с 18.12.2009
Offline
92
#5

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

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