Выборка юзеров из таблицы при условии наличия этих юзеров в массиве

Кинотавр

Новичок
Выборка юзеров из таблицы при условии наличия этих юзеров в массиве

Здравствуйте.

Есть такая проблема.

Имеется таблица юзеров в базе данных. Имеется $online - массив юзеров, находящихся в данный момент в онлайне. Юзер должен получить онлайн-лист юзеров, причем этот онлайн-лист разбит на страницы. То есть, надо из базы данных дернуть выборку юзеров, имеющихся в массиве $online. Причем дернуть ее надо с LIMIT.
Не соображу как это сделать.
Подскажите, пожалуйста.

Спасибо.
 

fixxxer

К.О.
Партнер клуба
а не проще ли онлайновых юзеров в отдельной табличке хранить (ну или проставлять поле isOnline в table_members) ?
 

Кинотавр

Новичок
Автор оригинала: fixxxer
а не проще ли онлайновых юзеров в отдельной табличке хранить (ну или проставлять поле isOnline в table_members) ?
Нет.
Дело в том, что проект должен обеспечивать колоссальную нагрузку, и работа с базой данных там минимизирована до предела. Онлайн-лист - не слишком посещаемая страница, поэтому используется выборка. А массив онлайн-юзеров приходит из компилированного модуля.
 

Кинотавр

Новичок
Автор оригинала: tony2001
SELECT * FROM table WHERE id IN (1,2,3,4,5,7123);
Большое спасибо.
То есть, я так понял, что надо сформировать строку SQL-запроса в цикле.
Как Вы считаете, если будет 500 тысяч юзеров в таблице, и 10 тысяч в онлайне, не окажется ли такой запрос невозможным для исполнения? Ведь надо сформировать строку запроса из 10 тысяч элементов.

Спасибо.
 

fixxxer

К.О.
Партнер клуба
10 тысяч в онлайне? Сразу? А накойхрен кому-то просматривать список в 10 тысяч? :)
 

tony2001

TeaM PHPClub
10 тысяч в онлайне?
почему бы сразу не 100000000000000000000000 тысяч ?
закладываться, так закладываться уже, чего уж там.
 

Кинотавр

Новичок
Странная манера ответа.
Ну что ж, раз этого избежать нельзя, то придется объяснить.
Сейчас в онлайне уже одновременно сидят по 2-3 тысячи. Ресурс специально переделывается под большую емкость, поэтому возникла потребность обеспечить 10 тысяч и больше.
 

tony2001

TeaM PHPClub
>Сейчас в онлайне уже одновременно сидят по 2-3 тысячи.
1:
сайты с такой посещаемостью не делаются на РНР.
здесь в дело вступает Си.

2:
странная постановка вопроса.
могу себе представить список "кто в онлайне" из 10 000 человек...

3:
странная ситуация.
сайт с такой посещаемость разрабатывается новичком.
либо такая посещаемость - неправда/ошибка, либо сайт вдвойне странный.
 

Кинотавр

Новичок
Поскольку tony отказался ответить на вопрос, а вместо ответа предпочел разговаривать о чем угодно, но только не по теме вопроса, прошу ответить тех, кто сможет.
Вопрос звучит так: сможет ли сервер отработать выборку, вида "SELECT * FROM table WHERE id IN (1,3,4,5,...[и так может быть до 10000])"?

Спасибо.
 

ONK

Пассивист PHPСluba
Либо период времени с момента последнего запроса страници в течении которого считается что пользователь "онлайн" слишком большой, скажем 30минут... Надо уменьшать период...
 

ONK

Пассивист PHPСluba
Кинотавр, обработать сможет, но это будет медленный запрос.
Единственное решение при такой реализации это деление массива идентификаторов пользователей на части по х идентификаторов, для реализации постраничной навигации. При этом глобальный порядок сортировки придётся задавать в момент формирования общего массива.
Сортировку в пределах выбираемой страници можно засунуть в сам запрос...
"SELECT * FROM tab WHERE id IN(".implode(',',$segment_arr).") ORDER BY order_col"
 

Кинотавр

Новичок
Уважаемый ONK,
Спасибо за ответ.
Массив содержит ники юзеров. Поэтому можно было даже сделать проще и негрузибельно - рвать на страницы не выборкой, а непосредственно массив. То есть, сначала отсортировать массив, а потом помещать в выборку не весь массив, а лишь текущий фрагмент массива. Но дело в том, что массив содержит ники все вместе - не разбитые по категориям. А в выборке должны быть еще дополнительные параметры, например, женщины или мужчины. Поэтому придется запихивать в выборку весь массив. Собственно, что я успешно и сделал. Не знаю как будет работать на максимальной нагрузке, но пока работает нормально.
 
Сверху