Новости
Документация
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

> Original message text:
> 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
>
> Но разумеется с ростом документов и прочих данных, подобный запрос выполняется всё медленнее и медленнее :( Нашли промежуточное решение, когда все эти результирующие ленты формируются заранее. Но такая таблица связей уже занимает около миллиона ячеек, и растёт в геометрической прогрессии.
>
> Может у кого есть изящное решение данной проблемы?
>
>


From: Dubrovsky - 20/12/2004 - 08:31:33
Subject:Помогите с запросом для создания френдлент
-----------------
выборку(соединение) надо проверить на оптимальность
с помощью команды EXPLAIN SELECT ...
неплохо бы почитать на эту тему
поэтому

1) обычно соединение (JOIN) начинают с таблицы в которой выполняется выборка (почему так подумай сам), в данном случае это таблица friends, но часто mysql меняет эту последовательность, пытаясь оптимизировать запрос (опять-таки смотри EXPLAIN), в таком случае надо использовать STRAIGHT_JOIN.

2) не вижу смысла использовать в данном случае LEFT JOIN, используй INNER JOIN эта операция попроще

итого получаем:

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

как вариант
select STRAIGHT_JOIN d.ID as DOCID, d.CREATOR, d.NAME, ...


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

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

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



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