Есть таблица сообщений: message_id, message_from, message_to. Здесь message_from, message_to — это ID пользователей от кого и кому данное сообщение.
Есть таблица пользователей user_id, login.
Как построить запрос, чтобы вывести одновременно message_id, login от кого, login кому?
Если нужно было бы вывести только один message_id и логин — понятно что делается через LEFT JOIN users ON user_id = message_from. А как вывести логины сразу обоих пользователей?
taliban, — не согласен про подзапросы и джоины.
Если использовать правила: тип и длина соединяемых графов должны совпадать и соединять графы проиндексированые по первичному ключу. То соединения предпочтительней подзапроов.
Если такой оптимизации не хватает то подзапросы реализуют в виде отдельных запросов, результаты которых присваивают сеансовым переменным которые используются в последующем запросе.
Если и этого не подходит можно создавать временные таблицы.
Оптимизация подзапросов майэскьюэлем далека от совершенства.
(«MySQL использование и администрирование», Викрам Васвани)
А вообще если совсем туго нужно для конкретного случая реализовывать тестировать и измерять.
select users_from.login as login_from, users_to.login as login_to…
LEFT JOIN users as users_from ON users_from.user_id = messages.message_from,
LEFT JOIN users as users_to ON users_to.user_id = messages.message_to,
Сделайте 2 запроса.
Первый выбирает сообщение, включая ID пользователей, с ним связанных.
Второй выбирает обоих пользователей по ID.
В случае использования JOIN изменение в любой таблице влечет за собой сброс кеша запроса в базе.
В случае двух запросов изменения например в таблице messages не будут сбрасывать кеш запроса по таблице пользователей, и наоборот.