@Alk90
php, mysql, jquery, css, html, api

Как выполнить LEFT JOIN с условием?

Всем привет. У меня есть две таблицы:
messages - хранит сообщения.
messages_read - хранит данные о том прочитано ли сообщение пользователем.
Когда я получаю список сообщений из БД и хочу определить было ли прочитано сообщение текущим пользователем, мне приходится выполнять LEFT JOIN и запрос получается таким.
SELECT m.`id`, m.`message`, mr.`readed` 
FROM `messages` m
LEFT JOIN `messages_read` mr ON mr.`message_id` = m.`id` AND mr.`user_id` = 111
WHERE m.`chat_id` = 12

Обратите пожалуйста внимание на AND mr.`user_id` = 111. Мне это условие просто необходимо, потому что нужно знать прочитал ли именно этот пользователь это сообщение.
Но в документации MySql сказано, что нужно избегать условий в конструкции JOIN.

Подскажите, как лучше поступить в этой ситуации?
  • Вопрос задан
  • 11239 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Если бы нужно было определить прочел ли пользователь сообщение, был бы смысл делать выборку именно как у вас, но указав в полях возврата mr.`user_id`, который был бы либо айди, либо нулл. Если же у вас МНОГО людей в чате - тогда правильнее будет сделать так:
SELECT m.`id`, m.`message`, mr.`message_id` status
FROM `messages` m
LEFT JOIN (
      select `message_id` 
      from `messages_read`
      where `user_id` = 111
) mr 
ON mr.`message_id` = m.`id` 
WHERE m.`chat_id` = 12
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
egor_nullptr
@egor_nullptr
Если запрос отрабатывает за приемлемое для вас время, то ничего не меняйте.
Ответ написан
Комментировать
SELECT m.`id`, m.`message`, case when mr.`message_id` is not null then 'Прочитано' else 'Не прочитано' end as iRead
FROM `messages` m
LEFT JOIN `messages_read` mr ON mr.`message_id` = m.`id`
WHERE m.`chat_id` = 12 and AND mr.`user_id` = 111
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Можно условие вынести в where - современные оптимизаторы в обоих случаях построят одинаково оптимальный план
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы