1

次のデータベースからいくつかのフィールドを取得しようとしています。

CREATE TABLE `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message` text,
  `date` datetime DEFAULT NULL,
  `fra` int(11) DEFAULT NULL,
  `til` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;


Fra=送信者ID;
til =レシーバーID

たとえば、次の値があります。

(1, 'This is a message for Obama', '2012-11-14 01:12:06', 1, 3),
(2, 'Hello John! How are you?', '2012-11-14 01:23:43', 3, 1),
(3, 'Hey Jack', '2012-11-14 01:28:11', 1, 2),
(4, 'How are you son?', '2012-11-14 01:28:15', 1, 2),
(5, 'everything allright for you?', '2012-11-14 01:28:23', 1, 2);


データベースからフィールドを取得する方法は次のとおりです
。あるユーザーから別のユーザーへの固有の会話を取得したい。ユーザー1がユーザー3にメッセージを送信し、ユーザー3がユーザー1に返信した場合、データベースの最後のフィールドのみを選択したいと思います。または、ユーザー1がユーザー2に3つのメッセージを送信した場合、ユーザー1からユーザー2に3番目のメッセージのみを取得したいので、結果として2行のみを取得する必要があります。

私が試してみました:

SELECT DISTINCT * FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."' GROUP BY fra,til"



"SELECT DISTINCT(til) AS til FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."'  ORDER BY id DESC"

しかし、私は私が望む結果を得ることができません。

誰かが私にこれを行う方法を説明できますか? 編集: 2人のユーザー間で送信された最後のメッセージを表示するユーザーメッセージのスレッド

のみを作成したい(これがクエリの範囲です)

4

4 に答える 4

2

sqlステートメントの回答/例は次のとおりです。http://sqlfiddle.com/#!2/ae56b/ 10

select * 
from messages m1
where m1.date = (select max(m2.date) 
    from messages m2 
    where 
    case when m2.fra < m2.til then m2.fra else m2.til end = 
    case when m1.fra < m1.til then m1.fra else m1.til end
    and 
    case when m2.fra > m2.til then m2.fra else m2.til end = 
    case when m1.fra > m1.til then m1.fra else m1.til end
);
于 2012-11-14T08:54:17.337 に答える
2

group-byも値を取得できると思います。

select * from messages where ID in(select max(ID)from messages where fra='"。$_SESSION['userid']。"'ORtil='"。$_SESSION['userid']。"'GROUPBY fra 、til)

于 2012-11-14T09:09:35.197 に答える
1

これは実際にはDISTINCTの場合ではなく、結果を1レコードに制限したい場合です。これを試して:

SELECT * FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."' ORDER BY `date` DESC LIMIT 1
于 2012-11-14T08:37:26.327 に答える
0

ある種の「key=>value」コレクションを使用してエミュレートできると思います

あなたのクエリは

SELECT @discution := (MAX(til,Fra)+","+MIN(til,Fra)) AS key , messages.* FROM messages
 ORDER BY id DESC LIMIT 1 OFFSET 0 GROUP BY @discution 
于 2012-11-14T08:40:42.800 に答える