1

ストレージに mysql を使用してメッセージ システムを実装したいと考えています。

これはテーブルです:

CREATE TABLE `message` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_from` int(10) unsigned NOT NULL,
  `id_to` int(10) unsigned NOT NULL,
  `time` datetime NOT NULL,
  `message` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
);

id_from はメッセージ送信者、id_to はメッセージ受信者です。

以下に、テスト目的で 4 つのメッセージを挿入します。

INSERT INTO `message`(`id`,`id_from`,`id_to`,`time`,`message`) VALUES
(1,1,2,'2012-07-05 12:18:49','msg1'),
(2,2,1,'2012-07-05 12:18:58','msg2'),
(3,3,1,'2012-07-05 12:19:04','msg3'),
(4,1,3,'2012-07-05 12:19:10','msg4');

私がやりたいことと成功していないことは、特定のユーザーの各ペア (id_from、id_to) に対して最後に送信または受信されたメッセージを取得するクエリを作成することです。この場合、結果は次のようになります。

row1: 2,2,1,'2012-07-05 12:18:58','msg2'
row2: 4,1,3,'2012-07-05 12:19:10','msg4'
4

2 に答える 2

0

SELECT * FROM メッセージ WHERE id_from = 1 OR id_to = 1 ?

于 2012-07-05T10:32:38.927 に答える
0
SELECT id, id_from, id_to, time, message
FROM (  SELECT 
        FROM message
        WHERE 1 IN (id_from, id_to) # 1 is user_id in this case
        ORDER BY time DESC) AS h
GROUP BY LEAST(id_from, id_to), GREATEST(id_from, id_to)

最後に送受信されたメッセージを取得するための解決策(ただし、要求されたものではありません)

SELECT id, id_from, id_to, time, message
FROM (  SELECT 
        FROM message
        WHERE 1 IN (id_from, id_to) # 1 is user_id in this case
        ORDER BY time DESC) AS h
GROUP BY id_from, id_to

やるべきだと思います。

これをキャプチャするための「よりきれいな」形式があると確信しています。

検討:

SELECT id, 'from' AS type, id_from AS type_id, time, message
FROM message
WHERE id_to = 1
ORDER BY time DESC
LIMIT 1
UNION ALL
SELECT id, 'to', id_to, time, message
FROM message
WHERE id_from = 1
ORDER BY time DESC
LIMIT 1

これにより、次のことが得られます。

id  type  type_id  time                 message
3   from  3        2012-07-05 12:19:04  msg3
4   to    3        2012-07-05 12:19:10  msg4
于 2012-07-05T10:38:02.760 に答える