За последние 24 часа нас посетили 17800 программистов и 1625 роботов. Сейчас ищут 1866 программистов ...

Вывод сообщений как в ВК

Тема в разделе "MySQL", создана пользователем pr0n1x, 21 дек 2016.

  1. pr0n1x

    pr0n1x Активный пользователь

    С нами с:
    30 мар 2006
    Сообщения:
    486
    Симпатии:
    2
    Адрес:
    Киев
    Всем привет, помогите составить запрос для вывода список собщений как в ВК

    Есть следующая таблица

    Код (Text):
    1. CREATE TABLE `messages` (
    2.   `id` int(11) NOT NULL,
    3.   `user_id` int(11) DEFAULT NULL,
    4.   `to_user_id` int(11) DEFAULT NULL,
    5.   `message` text,
    6.   `is_read` tinyint(1) NOT NULL DEFAULT '0',
    7.   `created` datetime NOT NULL
    8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    id - идентификатор сообщения
    user_id - идентификатор пользователя, который отправил сообщение
    to_user_id - идентификатор пользователя, кому отправили сообщения сообщение
    message - сообщение
    is_read - прочитано сообщение получателем
    created - дата сообщения

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

    1. Вывести список всех пользователей с которыми общался пользователь или пользователи которые писали пользователю
    2. Отсортировать этот список по последним сообщения, пользователь который последннйи оправил сообщения в самом верху
    3. Вывести последнее сообщение для каждого пользователя
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    список всех сообщений одного пользователя
    WHERE user_id=:x OR to_user_id=:x

    список сообщений между пользователями x и y. тут надо аккуратно обращаться с "И" и "ИЛИ".
    WHERE (user_id=:x AND to_user_id=:y) OR (user_id=:y AND to_user_id=:x)

    добавляешь ORDER BY и LIMIT и получаешь желаемое

    есть трюки с оптимизацией по скорости за счет добавления специальных "сортировочных" колонок, но ты сначала добейся просто чтобы работало..
     
    #2 artoodetoo, 21 дек 2016
    Последнее редактирование: 21 дек 2016
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    список корреспондентов в обратном календарном порядке сообщений:
    здесь x - идентификатор текущего пользователя.

    Код (Text):
    1. SELECT DISTINCT IF(user_id=:x, to_user_id, user_id) AS another_user_id
    2. FROM messages
    3. WHERE user_id=:x OR to_user_id=:x
    4. ORDER BY created DESC
    дистинкт нужен чтобы сгруппировать одинаковые id. к сожалению сюда нельзя добавить другие колонки, это убъет условие уникальности.
    --- Добавлено ---
    если тебе интересно развить тему, потрудись вколотить в sqlfiddle.com пару десятков записей переписки между 3-5 пользователями. тогда я покажу трюки.