• Как правильно вывести последнее сообщение в блок слева который будет на картинке?

    @pantsarny
    Select message from messages where from_user_id in ($user_id, $peer_id) and to_user_id in ($user_id, $peer_id) order by date desc limit 1
    Ответ написан
  • Как правильно вывести последнее сообщение в блок слева который будет на картинке?

    vndrussia
    @vndrussia
    Вроде разработчик,а вроде и нет
    Сообщения:
    +----+---------+------------+--------+--------------+------------+
    | id | message | date       | status | from_user_id | to_user_id |
    +----+---------+------------+--------+--------------+------------+
    | 1  | ...     | 1693310921 | 0      | 15           | 20         |
    | 2  | ...     | 1693317654 | 0      | 20           | 15         |
    | 3  | ...     | 1693318102 | 0      | 19           | 15         |
    | 4  | ...     | 1693318124 | 0      | 15           | 19         |
    +----+---------+------------+--------+--------------+------------+

    Юзеры:
    +----+---------+
    | id | login   |
    +----+---------+
    | 15 | user1   |
    | 19 | user2   |
    | 20 | user3   |
    +----+---------+

    Тогда запрос будет примерно такой:
    SELECT
        m1.*,
        u1.login AS from_user_login,
        u2.login AS to_user_login
    FROM
        messages m1
    JOIN
        (
            SELECT
                LEAST(from_user_id, to_user_id) AS user1_id,
                GREATEST(from_user_id, to_user_id) AS user2_id,
                MAX(date) AS max_date
            FROM
                messages
            GROUP BY
                LEAST(from_user_id, to_user_id),
                GREATEST(from_user_id, to_user_id)
        ) m2 ON LEAST(m1.from_user_id, m1.to_user_id) = m2.user1_id
            AND GREATEST(m1.from_user_id, m1.to_user_id) = m2.user2_id
            AND m1.date = m2.max_date
    JOIN
        users u1 ON m1.from_user_id = u1.id
    JOIN
        users u2 ON m1.to_user_id = u2.id;


    Могу ошибаться,редко составляю такие громоздкие запросы.
    Но суть вроде передал верно.

    P.S я бы может более костыльно сделал но:
    Сделать таблицу last_msg
    и писать в нее id(unic auto),to_user,from_user,message
    И просто при отправке сообщения опред юзеру обновлять данную таблицу и хранить в ней последнее сообщение всегда.А выводить по to_user где to_user = id просматривающего.
    Ответ написан
    Комментировать
  • Как правильно вывести последнее сообщение в блок слева который будет на картинке?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    SELECT m.*, u.login, i.img
        FROM messages m
        LEFT JOIN users u
        ON m.to_user_id = u.id
        LEFT JOIN image i 
        ON m.to_user_id = i.obj_id 
        WHERE m.date > :lastdate # надо выбирать все что позже уже полученных сообщений
        AND image.obj_type = 'user' 
        AND m.from_user_id = :fid  # айди "от юзера"
        AND m.to_user_id = :tid #айди "к юзеру"
        ORDER BY m.date  # по возрастанию все старше последнего полученного
    Ответ написан
    Комментировать