







|
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,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
19139
|
|