4

私はメッセージシステムとチャットシステムを兼ねているメッセージシステムを持っています。これらはソースと呼ばれるフィールドによって区別されます。

メッセージセクションは適切に並べ替えられ、グループ化されていますが、チャットセクションでは、これらが適切にグループ化されていません。以下のSQLを参照してください。

SELECT * 
FROM messages
WHERE ( senderID = "1" OR receiverID = "1" ) 
AND source = "1" 
GROUP BY receiverID, senderID 
ORDER BY addedDate DESC LIMIT 10

したがって、私が期待している結果は、試合ごとに1つ、つまり会話ごとに1つだけです。

しかし、何らかの理由で2つ取得しています。

前もって感謝します

4

3 に答える 3

2

それぞれの人が両方の位置にいるため、チャットごとに2つの回答が得られる可能性があります

ChatID  Sender Receiver
1       1      2
2       2      1
3       1      2
4       2      1

So, you'll have a record grouped by 
Sender / Receiver
1        2         and
2        1

あなたが探しているのは、会話の中で、彼らがいる位置に関係なく、上記を「ワンチャット」と見なすべき明確な人々だと思います。これを修正するには、次のようにします...

select 
      PreQuery.*,
      m2.Message,
      m2.SenderID,
      m2.ReceiverID
   from
      ( SELECT 
              if( m.senderID < m.receiverID, m.senderID, m.receiverID ) as Person1,
              if( m.senderID < m.receiverID, m.receiverID, m.senderID ) as Person2,
              max( m.ID ) as LastMessageIDPerChat,
              max( m.AddedDate ) as LastMessageDate
           FROM 
              messages m
           WHERE 
                  m.Source = "1"
              AND "1" IN ( SenderID, ReceiverID )
           GROUP BY
              Person1, 
              Person2
           ORDER BY 
              m.AddedDate DESC 
           LIMIT 10 ) PreQuery

         JOIN Messages m2
            on PreQuery.LastMessageIDPerChat = m2.ID

これにより、上記のように誤った重複を防ぐために、IDが低い方が常に最初の位置になり、IDが高い方が常に2番目の位置になります。

また、注意してください... GROUP BYは通常、すべての非group byフィールドが何らかの集計に関連付けられていることを期待しています。そうでない場合、修飾条件で見つかったレコードの最初のインスタンスを取得するだけです。したがって、同じ人を異なる日に会話に含めたい場合は、グループに「AddedDate」を追加して、次のようにすることができます...

Person1   Person2  on 4/20
Person1   Person3  on 4/20
Person3   Person4  on 4/20
Person1   Person2  on 4/18
Person1   Person5  on 4/17
Person3   Person4  on 4/15

最後に送信した人のステータスを取得するには、会話ごとにペアの人のクエリをラップし、その会話の最後のIDを取得する必要がありました。次に、それを取得して、そのIDのメッセージに再度参加します(IDが実際にメッセージテーブルの主キーIDである場合は、必要に応じて調整します)。参加から、会話の最後のメッセージと、そのトランザクションの送信者IDと受信者ID(および現在のエイリアス「m2」参照から必要なその他のデータ)を取得できます。

于 2012-04-27T13:42:35.570 に答える
1

IDが整数ではありませんか?

SELECT
    receiverID,
    senderID,
    MAX(addedDate) as maxAddedDate
FROM 
    messages 
WHERE 
    ( 
        senderID = 1
        OR receiverID = 1 
    )  
    AND source = 1
GROUP BY
    receiverID, 
    senderID  
ORDER BY 
    addedDate DESC 
LIMIT 10 
于 2012-04-27T12:52:55.927 に答える
0

これをチェックしてください。

SELECT
    receiverID,
    senderID,
    MAX(addedDate) as maxAddedDate
FROM messages 
WHERE ( senderID = 1 OR receiverID = 1) AND source = 1
GROUP BY receiverID, senderID  
ORDER BY addedDate DESC 

groupbyフィールドの集計については言及していません。

いずれかのgroupbyフィールドに応じて複数のレコードがある場合、どうなるでしょうか。

あなたは合計、カウント、...を持っている必要があります

于 2012-04-27T12:45:31.370 に答える