Как получить последние отправленные вам сообщения:
SELECT msg, `from` as other_user_id
FROM last_msg
WHERE `to` = :user_logged;
Если вы также хотите, чтобы сообщения, которые вы отправляли в последний раз:
SELECT msg, `to` as other_user_id
FROM last_msg
WHERE `from` = :user_logged;
Вы говорите, что храните только одно последнее сообщение в чате. Я прочитал это, поскольку для пользователей A и B в таблице будет только одна строка (либо последнее сообщение A, отправленное B, либо последнее сообщение B, отправленное A). Таким образом, вы можете просто объединить два запроса и по-прежнему показывать только одно последнее сообщение в чате.
SELECT m.msg, u.user_id, u.username, u.avatar
FROM
(
SELECT msg, `from` as other_user_id
FROM last_msg
WHERE `to` = :user_logged
UNION ALL
SELECT msg, `to` as other_user_id
FROM last_msg
WHERE `from` = :user_logged
) m
JOIN users u ON u.user_id = m.other_user_id;
Альтернативой UNION ALL
является объединение и CASE WHEN
:
SELECT m.msg, u.user_id, u.username, u.avatar
FROM last_msg m
JOIN users u
ON u.user_id = CASE WHEN :user_logged = m.from THEN m.to ELSE m.from END as other_user_id
WHERE :user_logged IN (m.from, m.to)
Это предложение ON
также можно записать как
ON (u.user_id = m.from AND :user_logged = m.to)
OR (u.user_id = m.to AND :user_logged = m.from)
или
ON u.user_id IN (m.from, m.to) AND u.user_id <> :user_logged;
кстати. Выберите то, что вам больше нравится.
А вот способ использовать параметр идентификатора пользователя только один раз в запросе:
SELECT m.msg, u.user_id, u.username, u.avatar
FROM (select :user_logged as user_id) myself
JOIN last_msg m ON myself.user_id IN (m.from, m.to)
JOIN users u ON u.user_id IN (m.from, m.to) AND u.user_id <> myself.user_id;