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
Никогда не следует указывать в части ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов. Если необходимо указать, какие строки должны присутствовать в результате, следует сделать это в выражении WHERE.
в документации MySql сказано, что нужно избегать условий в конструкции JOIN.
Никогда не следует указывать в части ON какие бы то ни было условия,
SELECT m.`id`, m.`message`
FROM `messages` m
LEFT JOIN `messages_read` mr
ON mr.`message_id` = m.`id`
WHERE m.`chat_id` = 12
AND mr.`user_id` = 111
Во первых там написано не в "джоин" а в "он",
Ну и ON это все то, что идет после ON, включая ON .... AND ....Угу, и order by, limit - все это on... Нет, он это он, вэа это отдельный оператор.
А значит если записи о прочтении не существует, то и само сообщение мы не получим.Ну а зачем тогда вообще его джойнить если в возвращаемые поля у вас все равно ничего из этой таблицы не попадает?
Ну а зачем тогда вообще его джойнить если в возвращаемые поля у вас все равно ничего из этой таблицы не попадает?
Ну так мне нужно показать сообщения. А если нет данных прочитано оно или нет, то это же не значит что и само сообщение не нужно показыватьНадеюсь вы понимаете что в таком случае это условие там вообще ниочем? То есть что с ним, что без него - результат будет один и тот же.
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
ELECT m.`id`, m.`message`, (
select mr.`status`
from `messages_read` mr
where mr.`user_id` = 111 AND mr.`message_id` = m.`id`
) readed
FROM `messages` m
WHERE m.`chat_id` = 12
Но не будет в таком случае правильней сделать с подзапросом без LEFT JOIN?