0

Web サイト用のチャット アプリケーションの開発を開始しました。

バックエンドに入る前に、最初にいくつかのJavaScript部分を行いました。そして今、データベース構造を作成しました:

CREATE TABLE IF NOT EXISTS `wp_bp_my_chat` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `from` varchar(255) NOT NULL DEFAULT '',
  `to` varchar(255) NOT NULL DEFAULT '',
  `message` text NOT NULL,
  `sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `recd` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `to` (`to`),
  KEY `from` (`from`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

今、このデータベースを持っているので、「from」または「to」でグループ化されたすべてのメッセージを表示するように要求したいと思います

Facebook のメッセージと考えてください。実際のページに移動すると、左側のサイドバーに会話ごとにグループ化されたメッセージが表示されます。

出力は次のようになります。

  • "user_1" と "user_2" の会話 (未読) 2 時間前

    "user_1" と "user_3" の会話 (未読) 3 時間前

    "user_1" と "user_5" の間の会話 5 時間前

私のメッセージは会話のようにグループ化されています。user_2 からの 10 件のメッセージがあるかもしれませんが、1 件として表示されるはずです (および最後のメッセージからの情報)。

次に行く方法はありますか?私はまだPHP側を行っていないので、ソリューションに合わせてデータベースを変更することを提案することもできます.

ありがとう。

4

3 に答える 3

2

会話のために 1 人 ('user_1') に対してこれを実行すると仮定します。つまり、その人は from または to のいずれかになります。また、from であっても to であっても問題はないと思いますが、会話の相手によってグループ化されます。もしそうなら、これを試してください。(テスト用にサンプル データを SQLFiddle に入れる必要があります)

SELECT MostRecent.MainPerson AS MainPerson
  , MostRecent.OtherPerson AS OtherPerson
  , MostRecent.Sent AS Sent
  , IF(wp_bp_my_chat.recd = 0, 'Unread','Read') AS Status
FROM wp_bp_my_chat
JOIN (
    SELECT 'user_1' AS MainPerson
       , IF(msgs.`from` = 'user_1',msgs.to, msgs.`from`) AS OtherPerson
       , MAX(msgs.sent) AS sent
    FROM wp_bp_my_chat AS msgs
    WHERE msgs.`from` = 'user_1' OR msgs.`to` = 'users_1'
    GROUP BY MainPerson, OtherPerson) AS MostRecent
  ON (wp_bp_my_chat.`from` = MostRecent.MainPerson OR wp_bp_my_chat.`to` = MostRecent.MainPerson)
    AND (wp_bp_my_chat.`from` = MostRecent.OtherPerson OR wp_bp_my_chat.`to` = MostRecent.OtherPerson)
    AND MostRecent.sent = wp_bp_my_chat.sent
ORDER BY sent DESC
于 2013-10-13T18:57:23.923 に答える
0

更新で説明した結果を得るには、次を使用します。

SELECT count(*), max(sent) 
FROM wp_bp_my_chat
WHERE to = 'name of recipient'
GROUP BY from 

count(*)メッセージの数とmax(sent)最新のメッセージの時刻が表示されます。これを使用して、出力の「時間前」の部分を計算できます。

メッセージが既読かどうかを示すフラグがテーブルに表示されません。「(未読)」テキストを追加するには、それを追加する必要があります。

于 2013-10-13T18:05:23.670 に答える