5

ユーザー間のメッセージを保持する単純なテーブルがあります。テーブル構造は次のようになります

     sender    receiver   message   sendtime
      1          2          m1      2012-01-01 12:12:12  
      2          1          m2      2012-01-01 12:50:20
      1          2          m3      2012-01-01 12:55:55
      1          3          m4      2012-01-02 05:05:05
      1          4          m5      2012-01-05 05:20:20
      4          1          m6      2012-01-06 06:05:00
      4          1          m7      2012-01-07 11:11:11
      2          4          m8      2012-01-08 05:01:01

さて、ID 1 のユーザーの場合、次のような結果が必要です

    sender     receiver   message   sendtime
     1           2          m3      2012-01-01 12:55:55
     1           3          m4      2012-01-02 05:05:05
     4           1          m7      2012-01-07 11:11:11

つまり、特定のユーザーが送信者であるか受信者であるかに関係なく、そのユーザーの最近のメッセージが必要です。

簡単に思えますが、単一の mysql クエリを作成する方法が見つかりません。

また、この種のソリューションでテーブルの設計が不十分な場合は、提案が必要です。

注: 私が言及する必要があると思うことの 1 つは、たとえば、ユーザー 1 とユーザー 2 の間に複数の通信があることです。

ほとんどのユーザーは、送信者 1、受信者 2、送信者 2、受信者 1 の 1 つのレコードを取得するクエリを提案しています。これは同じユーザー 1 とユーザー 2 間の通信であるため、これら 2 つのレコードは必要ありません。 1 つは、他の各ユーザーで指定されたユーザーの最新のものです。

ありがとう、

4

6 に答える 6

12
SELECT data.* FROM 
(SELECT MAX(sendtime) AS sendtime 
         FROM data 
         WHERE 1 IN (sender,receiver)
         GROUP BY IF (1 = sender,receiver,sender)) AS latest
LEFT JOIN data ON latest.sendtime = data.sendtime AND 1 IN (data.sender, data.receiver)
GROUP BY IF (1 = data.sender,data.receiver,data.sender)

external を避けるために、テーブルで一意のシーケンス ID を使用することをお勧めしますGROUP BY。一意にインクリメントしている場合message_id(つまり、大きい方message_idが later に対応する場合sendtime)、クエリははるかに単純になります。

SELECT data.* FROM 
(SELECT MAX(message_id) AS message_id 
         FROM data 
         WHERE 1 IN (sender,receiver)
         GROUP BY IF (1 = sender,receiver,sender)) AS latest
LEFT JOIN data USING(message_id)
于 2012-06-19T06:38:54.087 に答える
0

メッセージを主キーとして作成し、送信者と受信者を同じメッセージの 2 つの別々のテーブルに次のように配置してみてください。

Table 1: {message, sender, sendtime}
Table 2: {message, receiver, sendtime}
于 2012-06-19T05:51:47.010 に答える
0

これを試して:

SELECT  Distinct (*)
FROM    tableName   m
WHERE   date =
    (
    SELECT  MAX (date)
    FROM    tableName

    )
于 2012-06-19T06:12:29.337 に答える
-1

これはうまくいくでしょう

$query = "SELECT * FROM tableName WHERE `sender`='$userNumber' OR `receiver`='$userNumber' ORDER BY `sendtime` DESC LIMIT 0,1";
于 2012-06-19T05:47:50.537 に答える