2

これは私のmysqlテーブル構造です:

msgid | senderid | sender | recipientid | recipient | title | message | date 

Facebook が行ったように、プライベート メッセージング システムの受信トレイに表示したいと考えています。つまり、各会話は、着信か発信かに関係なく、テーブルから 1 回だけ出力されます。例えば:

My username is 'admin'.

USER   |   MESSAGE       |   DATE   |  DIRECTION
Dan    | Hello           |  1/2/10  | Incoming
Bob    | How are you Bob?|  30/1/10 | Outgoing

問題は、方向が異なるため、ユーザー名を繰り返さないことです。例えば:

USER   |   MESSAGE       |   DATE   |  DIRECTION
Dan    | Hello           |  1/2/10  | Incoming
Bob    | How are you Bob?|  30/1/10 | Outgoing
Bob    | Hi admin        |  30/1/10 | Incoming

したがって、方向に関係なく、表示される唯一のメッセージが最新の通信であることを確認する必要があります (つまり、そのユーザーが「送信者」か「受信者」かに関係なく、別のユーザーとの最新のメッセージ)。

このウェブサイトには PHP/MYSQL を使用しています。これを行うために何千もの方法を試しましたが、理解できません。データベースの構造が正しくない可能性があります。私は数時間オンラインになります(その後も継続的にチェックします)ので、ご不明な点がございましたらお気軽にお問い合わせください.

4

2 に答える 2

1

私が正しく理解していれば、これはあなたが必要とすることをするはずです:

SELECT
IF(senderid = :userId,recipient,sender) AS USER,
message,
date,
IF(senderid = :userId,'Outgoing','Incoming') AS DIRECTION
FROM message 
WHERE senderid = :userId OR recipientid = :userId 
ORDER BY date DESC

USER と DIRECTION は、このユーザーが送信者であるかどうかに基づいて決定されます。

最新のメッセージのみに関心がある場合は、このクエリに LIMIT を追加できます。

于 2013-01-09T03:08:19.277 に答える
0

私は次のように自分の質問をいくらか解決しました:

SELECT * FROM (
    SELECT * FROM (
         (SELECT id, reciever, recieverid, message, datetime FROM messages WHERE sender = '$user')
       UNION
          (SELECT id, sender, senderid, message, datetime FROM messages WHERE reciever = '$user')
          ) as t
       ORDER BY datetime DESC
    ) as t2
GROUP BY reciever ORDER BY datetime DESC

どのメッセージが着信または発信であるかはわかりませんが、それでうまくいくようです。実際のユーザーを招待する機会があれば、正しく機能するかどうかわかります。

于 2013-01-09T07:34:59.667 に答える