0

テーブル:

id    sender    receiver        message
 1      14        16            1st message from 14 to 16
 2      16        14            1st message from 16 to 14
 3      16        14            2nd message from 16 to 14
 4      14        16            2nd message from 14 to 16
 5      15        14            1st message from 15 to 14
 6      15        14            2nd message from 15 to 14
 7      14        16            3rd message from 14 to 16
 8      14        16            4th message from 14 to 16
 9      14        15            1st message from 14 to 15
10      14        15            2nd message from 14 to 15

ここで、私がここでやろうとしているのは、(受信者として) 1 人のユーザーのメッセージをグループ化することですが、問題は、メッセージの送信者に関係なく、最新のエントリが必要なことです

試行 1:

SELECT c2. *
FROM (

SELECT max( id ) `id`
FROM tbl_msg
GROUP BY `sender`
)c1
INNER JOIN tbl_msg c2 ON c1.id = c2.id
WHERE `receiver` =14
GROUP BY `sender`

結果:

id    sender    receiver        message
 6      15        14            2nd message from 15 to 14
 3      16        14            2nd message from 16 to 14

ここでの結果は、最後の各メッセージがユーザー 14 に送信されるということです。明らかに、ユーザー 14が送信したメッセージは含まれません。

繰り返しますが、 addtional GROUP BYonは使用できません。これは、ユーザー 14によって送信されreceiverた最後のエントリのみが含まれるためです。

期待される出力:

id    sender    receiver        message
10      14        15            2nd message from 14 to 15
 8      14        16            4th message from 14 to 16

上記でsenderは、両方のエントリで 14 ですが、任意のユーザーにすることができます。

簡単に言えば: ,

誰が言ったかに関係なく、A と B の間の会話の最後のメッセージを取得したいと考えています。

GROUP BYここで間違ったアプローチを使用していますか?

注: 以下の質問は、 1 つの基準のみを扱うという点を除いて、この質問と似ています。しかし、ここでは 2 つあります (つまり、ユーザーは送信者または受信者のいずれかになります)。これは私が立ち往生している部分です。

各グループの最後のレコードを取得する

MySQL - グループによって返される行を制御する

MySQLの各「グループ化」の「最後の」行を返す

Group By の最初の行と最後の行

4

1 に答える 1

2

これを試して、

SELECT  *
FROM    TableName
WHERE   (LEAST(sender, receiver),GREATEST(sender, receiver), id) 
        IN (
                SELECT  LEAST(sender, receiver) AS x,
                        GREATEST(sender, receiver) AS y,
                        MAX(id) AS max_ID
                FROM    TableName
                GROUP   BY x, y
            )

出力

╔════╦════════╦══════════╦═══════════════════════════╗
║ ID ║ SENDER ║ RECEIVER ║          MESSAGE          ║
╠════╬════════╬══════════╬═══════════════════════════╣
║  8 ║     14 ║       16 ║ 4th message from 14 to 16 ║
║ 10 ║     14 ║       15 ║ 2nd message from 14 to 15 ║
╚════╩════════╩══════════╩═══════════════════════════╝
于 2013-05-19T07:34:28.740 に答える