[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с пагинатором
Splaer
Собственно вопрос имеет отношение к этой теме

Я повторюсь:
Нужно делать выборку статей с участием друзей из вконтакте + по свежести создания.

Был бы простой запрос, я бы менял аргументы LIMIT в запросе + сортировка и дело в шляпе - в общем стандартный пагинатор.

Но в данном случае, есть куча друзей у пользователя. Я просто не представляю как сделать такой пагинатор с учетом того, что кол-во друзей у всех разное (у одного 30, у другого 5000), + важна сортировка по дате в таком формате:

10.10.12 - друг [Петя] [некая статья]
10.10.12 - друг [Вася] [некая статья]
10.10.12 - друг [Женя] [некая статья]
....
11.10.12 - друг [Петя] [некая статья]
11.10.12 - друг [Антон] [некая статья]
....
12.10.12 - друг [Женя] [некая статья]
12.10.12 - друг [Петя] [некая статья]
.....

Структура таблицы:
id
...
friend_id
text
date

...


Подскажите пожалуйста как такое реализовать, ибо все мои идеи иссякли.
Нужен принцип построения запросов.
Заранее благодарен.
Valick
начните например с определения приоритета, на первом месте свежесть статей или все таки важна определенная категория друзей (например по интересам, по знаку зодиака, по половому признаку, по сексуальной ориентации, по наличию домашних животных, по возрасту и т.д.)

_____________
Стимулятор ~yoomoney - 41001303250491
Splaer
Приоритет - свежесть статей, т.е. человек заходит и видит статьи с участием своих друзей в порядке убывания, от самых свежих к самым старым.
Valick
тогда в чем проблема? выборка всех статей принадлежащих друзьям, сортировка по дате добавления и лимит
SELECT * FROM news WHERE frend IN(...) ORDER BY date LIMIT 0, 10

___
запарился трохи

_____________
Стимулятор ~yoomoney - 41001303250491
Splaer
проблема в том, что если у человека 10 000 друзей, то размер запроса будет просто огромным.
получается следующее:

SELECT * FROM table WHERE friend_id in (id, id-2, ... id-10000) ORDER BY date DESC LIMIT {$start}, {$nums} 


К тому же, я могу ошибаться, но мне кажется, что скорость работы такой махины будут не "вау"...

-------

опоздал чуток с постом)
Valick
IN можно заменить JOIN'ом, но в любом случае при количестве 10000 друзей, на "ахалай махалай", и другие магические ритуалы рассчитывать не стоит, базе придется "попотеть"
поэтому я и спрашивал про приоритет по друзьям, если его нет, то вариантов тоже нет

_____________
Стимулятор ~yoomoney - 41001303250491
Splaer
Каким образом IN можно заменить JOIN'ом в данном случае ?

Цитата
в любом случае при количестве 10000 друзей, на "ахалай махалай", и другие магические ритуалы рассчитывать не стоит, базе придется "попотеть"

В этом собственно и состоит проблема.

Я вот думаю, может как-то разбивать друзей на части и запихивать по очереди, но тут не совсем понятно как это прикрутить к пагинатору, так как получается, что к каждому "куску" друзей понадобиться свой пагинатор, в силу разного количества результатов - с первого куска 10 статей, со второго 100, с третьего 0, с четвертого 5...

У меня в голове уже фарш из мыслей smile.gif
Valick
Цитата
может как-то разбивать друзей на части и запихивать по очереди

вы хотите совсем "убить" СУРБД? :)
SELECT * FROM `news` n RIGHT JOIN (SELECT f_id FROM `frends` WHERE user = $id) f 
ON n.autor_id = f.f_id ORDER BY n.`date` LIMIT ...


подзапрос SELECT f_id FROM `frends` WHERE user = $id с таким же успехом можно было вставить в конструкцию IN по идее разницы быть не должно, а там тестить надо

_____________
Стимулятор ~yoomoney - 41001303250491
Splaer
Цитата (Valick @ 9.03.2013 - 13:47)
Цитата
может как-то разбивать друзей на части и запихивать по очереди

вы хотите совсем "убить" СУРБД? smile.gif

Нет smile.gif

Я имел ввиду такую систему:

допустим первые 10 страниц - это 1 час друзей, при переходе на 11 страницу подключается другая часть друзей и так далее... В итоге каждый из запросов был бы не таким громоздким и базе было бы проще. Хотя считать кол-во страниц все равно придется общим запросом...
Или можно взять сумму результатов от запросов COUNT по каждой части друзей...
Надо помозговать rolleyes.gif ...

Нужна какая-то свежая идея, чтобы осенило )

Valick
что бы взять часть друзей, вам надо сначала сделать то, что я описал выше и уже потом отобрать друзей, новости от которых самые свежие.
т.е. вы упорно хотите еще больше нагрузить сервер?

_____________
Стимулятор ~yoomoney - 41001303250491
Splaer
Та нет, не хочу.
Просто хочется верить, что есть еще какой-то вариант )

Я уже подумывал перенести все это на Redis...
Но так как я не уверен в успехе проекта, сразу ставить на VPS/VDS нет смысла, а обычных хостингов с поддержкой Redis не видел...

Видимо придется сделать вышеописанным образом.
Splaer
Valick , большое спасибо! smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.