Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Помогите с запросом для создания френдлент (Алексей) 20/12/2004 - 01:46:14
      Re: Помогите с запросом для создания френдлент (Dubrovsky) 20/12/2004 - 08:31:33
      Re: Помогите с запросом для создания френдлент (Dubrovsky) 20/12/2004 - 08:34:55



From: Алексей - 20/12/2004 - 01:46:14
Subject:Помогите с запросом для создания френдлент
-----------------
Вводные данные задачи.

Есть таблица 'users'. Содержит ячейки:

ID int(11) auto_increment
LOGIN varchar(32)
PASSWD varchar(32)
NAME varchar(100)
и т.д. ....

Есть много разных таблиц, например 'doc' - документы, 'com' - комментарии, 'count' - счётчики и т.д. и т.п. для примера упрощённая структура таблицы 'doc':

ID int(11) auto_increment
CREATOR int(11)
NAME varchar(255)
NOTE text

где ID - уникальный номер документа
CREATOR содержит IDшник юзера (см. таблицу users), который создал данный документ

есть таблица 'friends', в которой хранятся взаимосвязи между юзерами. она имеет всего два поля:
ID int(11) - IDшник юзера, который добавил другого пользователя себе в френдлист и
FRIEND int(11) - IDшник добавленного юзера

т.е. если Вася (ID=1) добавил Петю (ID=13) в френды, то в ячейке будет
ID = 1, FRIEND = 13
(соответственно в таблице может быть очень много ячеек с одинаковыми данными ID и FRIEND, т.к. Вася может добавить не только Петю, а Петя может быть в друзьях не только у Васи)

Для примера, если Вася (имея ID=1) хочет получить список всех юзеров, которых он добавил в друзья, он дает запрос типа:

select f.FRIEND, a.LOGIN
from friends f left join users a ON a.ID=f.FRIEND
WHERE f.ID = '1'

А вот теперь Васе требуется получить все документы из базы doc которые принадлежат перу всех его friends. Если делать это тупым прямым запросом, полагаясь только на индексирование ячеек с данными, то это происходит примерно так (для 10 последних записей):

select d.ID as DOCID, d.CREATOR, d.NAME,
a.ID, a.LOGIN,
f.FRIEND
from doc d
left join users a ON a.ID=d.CREATOR
left join friends f ON f.FRIEND=d.CREATOR
WHERE f.ID = '1'
ORDER BY d.ID DESC
LIMIT 0, 10

Но разумеется с ростом документов и прочих данных, подобный запрос выполняется всё медленнее и медленнее :( Нашли промежуточное решение, когда все эти результирующие ленты формируются заранее. Но такая таблица связей уже занимает около миллиона ячеек, и растёт в геометрической прогрессии.

Может у кого есть изящное решение данной проблемы?



[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
19139



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |