2016-03-30 2 views
0

Итак, у нас есть таблица входящих сообщений, где мы сохраняем сообщения, которые пользователи отправляют друг другу. Вот таблица:Выберите последнюю отличную пару

CREATE TABLE IF NOT EXISTS `inbox` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`fromid` int(10) unsigned NOT NULL DEFAULT '0', 
`toid` int(10) DEFAULT NULL, 
`message` text CHARACTER SET utf8 NOT NULL, 
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
PRIMARY KEY (`id`), 
KEY `toid` (`toid`), 
KEY `fromid` (`fromid`), 
KEY `fromid_2` (`fromid`,`toid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; 

fromid и toid являются идентификаторами пользователей. У нас есть их идентификаторы, когда сообщение отправлено. Нам нужен запрос, который будет возвращать все сообщения, на которые не отвечают «наши пользователи» (администраторы). Табличные учетные записи отслеживают пользователей. Для упрощения:

CREATE TABLE IF NOT EXISTS `accounts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`our` int(1) unsigned NOT NULL DEFAULT '0', 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Поэтому в основном, нам нужен запрос, который дает нам пользователей, которых НЕ БЫЛИ ОТВЕТИЛ админами (пользователями), их количество и дату последнего сообщения, отправленные на ADMIN, заказать последний до самого старого.

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

Заранее благодарен.

EDIT: Из того, что я вижу, что мы сначала должны найти последнее взаимодействие двух отдельных пользователей в почтовом ящике стола ... проверьте & фильтр только те, которые были отправлены нашим пользователям

+0

Объясните связь между этими двумя таблицами. Если возможно, отправьте некоторый пример ввода вывода – 1000111

+0

Здравствуйте, в таблице учетных записей есть все пользователи, которые хранятся. пользователи со значением our = 1 являются админами. В другой таблице (входящие) - сообщения между пользователями. – Outlaw011

ответ

0

Как насчет этого?

SELECT i.* FROM inbox as i 
WHERE (i.toid, i.fromid) NOT IN 
(SELECT i2.fromid, i2.toid FROM inbox as i2 WHERE i2.`time` >= i1.`time` AND i2.id = 1); 

Другой способ с использованием join:

SELECT DISTINCT i1.* 
FROM inbox as i1 LEFT JOIN inbox as i2 
    ON i1.toid = 1 AND 
     i1.fromid = i2.toid AND 
     i1.toid = i2.fromid AND 
     i1.`time` <= i2.`time` 
WHERE i2.id IS NULL; 
+0

Привет, Дилан. i1 неизвестно. Я пробовал с> = i.'time', и теперь запрос заблокирован, занимает довольно много времени, я предполагаю, что это не то, что вы хотели :-) – Outlaw011

+0

Вы должны добавить JOIN в учетные записи, чтобы проверить, является ли отправитель администратором. – Reversal

+0

нет действительно. inbox is 204574, учетные записи 216131 – Outlaw011

0

Два возможных решения, представленные ниже: LEFT JOINрешение должно работать лучше.

LEFT JOIN Раствора

SELECT 
i.fromid, COUNT(*) AS unread, MAX(i.time) AS lastmsg 
FROM inbox AS i 
INNER JOIN accounts AS a 
ON i.toid = a.id 
LEFT JOIN inbox AS i2 
ON i.fromid = i2.toid AND i.toid = i2.fromid AND i.time <= i2.time 
WHERE a.our = 1 AND i2.id IS NULL 
GROUP BY i.fromid 
ORDER BY lastmsg DESC; 

НЕ В растворе

SELECT 
i.fromid, COUNT(*) AS unread, MAX(i.time) AS lastmsg 
FROM inbox AS i 
INNER JOIN accounts AS a ON i.toid = a.id 
WHERE a.our = 1 AND 
(i.toid, i.fromid) 
NOT IN (SELECT i2.fromid, i2.toid FROM inbox AS i2 WHERE i2.time >= i.time) 
GROUP BY i.fromid 
ORDER BY lastmsg DESC; 
+0

Это интересно. Я пробовал левое соединение и получаю id и количество оставшихся без ответа сообщений. единственная проблема, которую я вижу в этом, заключается в том, что они упорядочены по id, а не по времени отправлено последнее сообщение - есть ли способ сделать это? – Outlaw011

+0

Хм, и есть еще одна проблема. Похоже, что этот запрос фильтрует пользователей, которые не являются администраторами, КОТОРЫЕ были отправлены, а не те, у кого есть сообщения UNANSWERED. – Outlaw011

+0

Я обновил ответ, чтобы получить упорядоченную базу набора результатов в последнем неотвеченном сообщении.Что касается последнего комментария, результаты фактически фильтруются, чтобы рассматривать только сообщения, отправленные с admin (our = 1), на которые пользователь не ответил. – Reversal

Смежные вопросы