Создать запрос для 30 последних диалогов

Статус
В этой теме нельзя размещать новые ответы.

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Приветствую,

Есть 3 таблицы: пользователи, диалоги, id пользователей к диалогам.

Надо получить 30 последних диалогов пользователя, с десятком имен пользователей в каждом диалоге.

Первым делом получаем диалоги:
Код:
SELECT `dialogs`.* FROM `dialogs_accounts`, `dialogs` WHERE `dialogs_accounts`.`account_id` = {user_id} AND `dialogs`.`id` = `dialogs_accounts`.`dialog_id` ORDER BY `dialogs`.`update` DESC LIMIT 30

То есть из таблицы dialogs_accounts берем записи в которых есть пользователь, и в этих записях написаны ID диалогов. По этим id получаем уже сами диалоги.

Теперь надо по id диалога получить остальных пользователей.

Код:
SELECT * FROM `dialogs_accounts` WHERE `dialog_id`={dialog_id} LIMIT 10

А теперь надо для этих аккаунтов имена получить

Код:
SELECT * FROM `accounts` WHERE `id` = {dialogs_accounts.account_id}

Как бы это по-умному сделать?
 
Обычно часть из этих данных кэшируется и подставляется налету из кэша...

К примеру, забирается весь список пользователей и кэшируется id-login..

логины обновляются крайне редко, разве что регистрация новых, что явно реже, чем запрос диалогов. Я бы предложил через это делать.
 
К примеру, забирается весь список пользователей и кэшируется id-login..
Зависит от размера таблицы, на таблицах овер 100к уже могут наблюдаться проблемы.


Теперь надо по id диалога получить остальных пользователей.
А теперь надо для этих аккаунтов имена получить
Если я правильно понял то у тебя сейчас 60 запросов будет выполнятся - это совершенно бесполезный оверлимит.

Объедини таблички через join и дергай сразу из 2 таблиц в условии попробуй использовать IN (dialog_id,dialog_id,dialog_id,dialog_id) - при правильном использовании тормозов не будет и вместо 60 будет 1 запрос, что еще и ускорит.
Результирующий, что-то типа:
PHP:
SELECT * # хорошей практикой будет прописать здесь только нужные поля
FROM `accounts`
JOIN `dialogs_accounts` ON `accounts`.`id` = {dialogs_accounts.account_id}
WHERE `dialog_id` IN (dialog_id,dialog_id,dialog_id,dialog_id)
LIMIT 10

Для формирования IN условия, если не используется нормальная ORM можно взять код:
PHP:
" dialog_id IN ('" . join("', '", $data) . "')";
где $data массив dialog_id из результатов первого запроса
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху