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

Тема в разделе "Базы данных", создана пользователем Q_BASIC, 21 сен 2016.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    451
    Симпатии:
    1.159
    Приветствую,

    Есть 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}
    Как бы это по-умному сделать?
     
    dana77 нравится это.
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.308
    Симпатии:
    2.310
    Обычно часть из этих данных кэшируется и подставляется налету из кэша...

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

    логины обновляются крайне редко, разве что регистрация новых, что явно реже, чем запрос диалогов. Я бы предложил через это делать.
     
    Q_BASIC нравится это.
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.589
    Симпатии:
    1.497
    Зависит от размера таблицы, на таблицах овер 100к уже могут наблюдаться проблемы.


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

    Объедини таблички через join и дергай сразу из 2 таблиц в условии попробуй использовать IN (dialog_id,dialog_id,dialog_id,dialog_id) - при правильном использовании тормозов не будет и вместо 60 будет 1 запрос, что еще и ускорит.
    Результирующий, что-то типа:
    PHP:
    SELECT # хорошей практикой будет прописать здесь только нужные поля
    FROM `accounts`
    JOIN `dialogs_accountsON `accounts`.`id` = {dialogs_accounts.account_id}
    WHERE `dialog_idIN (dialog_id,dialog_id,dialog_id,dialog_id)
    LIMIT 10
    Для формирования IN условия, если не используется нормальная ORM можно взять код:
    PHP:
    " dialog_id IN ('" join("', '"$data) . "')";
    где $data массив dialog_id из результатов первого запроса
     
    Q_BASIC нравится это.
Статус темы:
Закрыта.