2016-03-30 21 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は、ユーザーのIDです。私たちは自分のIDを持っています。必要なのは、「ユーザー」(管理者)によって返信されないすべてのメッセージを返すクエリです。 テーブルアカウントはユーザーを追跡します。単純化するために:

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に送信された最後のメッセージの日付を与えるクエリを必要とする、から注文最後まで

これまでのところ、基本的なクエリしかありませんでしたが、投稿できる合理的なものはありませんでした。

ありがとうございます。

編集:私は、我々は最初の受信トレイテーブルの2人のDISTINCTのユーザーからの最後の相互作用を見つける必要が見るものから...その後&フィルタユーザーの皆様、この程度

+0

では、これらの2つのテーブル間の関係を説明できません。可能であれば、いくつかのサンプル入力出力を投稿する – 1000111

+0

こんにちは、accountsテーブルにはすべてのユーザが保存されています。値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

本当にありません。受信トレイは204574、アカウントは216131 – Outlaw011

0

2つの解決策: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; 

は解決

+0

これは興味深いです。私は参加を控えて、IDと未応答のメッセージの数を取得しています。私がこれを見る唯一の問題は、彼らがIDで注文されていることです。最後のメッセージが送られた時ではなく、それを行う方法はありますか? – Outlaw011

+0

ええと別の問題があります。このクエリは、メッセージが送信された管理者ではないユーザーをフィルタリングしていると思われます。 – Outlaw011

+0

最後に未応答のメッセージに基づいて順序付けられた結果セットを得るための答えを更新しました。最後のコメントについては、実際にフィルタリングされた結果は、ユーザーが応答していないadmin(our = 1)から送信されたメッセージのみを考慮してフィルタリングされます。 – Reversal

関連する問題