Как вывести последние сообщения, в которых пользователь принимал участие?

Рейтинг: -4Ответов: 1Опубликовано: 11.10.2014
CREATE TABLE IF NOT EXISTS `messages` (
    `id` int(11) NOT NULL,
    `from` int(11) NOT NULL,
    `to` int(11) NOT NULL,
    `text` text NOT NULL,
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `read` enum('0','1') NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Есть таблица, как вывести последние сообщения, в которых пользователь принимал участие.

Вот дам самой таблицы:

INSERT INTO `messages` (`id`, `from`, `to`, `text`, `date`, `read`) VALUES
(1, 56, 60, 'xfgvbxfgbfgb', '2014-10-10 10:11:33', '0'),
(2, 60, 56, ' rtdrtyhdtryjftujfyujyfju', '2014-10-10 11:12:14', '0'),
(3, 56, 62, 'srtgrtgdrtg', '2014-10-10 21:32:26', '0'),
(4, 67, 56, 'vdxfvdfvdf', '2014-10-10 22:04:38', '0');

Ответы

▲ 1

Ладно, заканчиваем глум

SELECT *
FROM messages
WHERE `from` = :id OR `to` = :id
ORDER BY `date` DESC
LIMIT 0, 5;

Это простой вывод всех последних сообщений с пользователем.

SELECT *
FROM messages
WHERE `from` = :id OR `to` = :id
GROUP BY `from`, `to`
ORDER BY `date` DESC
LIMIT 0, 5;

Выбирает уникальные пары from/to, но в пары (56, 60) и (60, 56) будут считаться разными.

Ну и наконец мастодонт, который отвратителен, но будет работать еще вероятнее:

SELECT * FROM (
  SELECT * FROM (
    SELECT id, `from` AS inspected_user,
        `to` AS interlocutor, `date`,
        `text`, `read`
    FROM messages AS m1
    WHERE `from` = :id
    UNION
    SELECT id, `to` AS inspected_user,
        `from` AS interlocutor, `date`,
        `text`, `read`
    FROM messages AS m2
    WHERE `to` = :id
  ) AS messages
  ORDER BY `date` DESC -- я тупой и не придумал, как избавиться от этого
) AS messages_outer
GROUP BY `interlocutor`
ORDER BY `date` DESC
LIMIT 0, 5;

Отдельно отмечу, что одна эта таблица содержит в себе сразу пять зарезервированных слов - from, text, date, to, read.

P.S. А если с самого начала организовать диалоги отдельной сущностью, то можно сохранить мозг в сохранности.

fiddle