0

プライベート メッセージを作成して受信トレイに入れようとしています。

$sqlInbox = "
    SELECT sender, receiver, message, parent, rView
    FROM messages 
    WHERE receiver='$log_username' OR sender='$log_username' 
    GROUP BY parent 
    ORDER BY timestamp DESC";

このコードは各グループをタイムスタンプで並べ替えているため、user1 が user2 の後にメッセージを送信した場合、user1 がリストの最初になります。ただし、私が抱えている問題は、各グループ内のメッセージがタイムスタンプ順に並べられていないため、ユーザーが送信した最新のメッセージである必要がある場合、グループの出力は常にユーザーが送信した最初のメッセージです。したがって、グループ内の行をタイムスタンプで並べ替えるだけでなく、グループ全体をタイムスタンプで並べ替える必要があります。私は一生、これを行う方法を理解できません。誰か助けてくれませんか?(親は、送信者/受信者に関係なく、2 人の共通ユーザーを共有するすべてのメッセージの共通 ID、つまり、任意の 2 人のユーザー間のすべてのメッセージのコレクションです)。前もって感謝します!

4

1 に答える 1

1

parent私はコーヒーが必要なので、あなたの質問を正しく読んでいるといいのですが、order by ステートメントにを追加するだけの問題ではありませんか?

$sqlInbox = "
    SELECT sender, receiver, message, parent, rView
    FROM messages 
    WHERE receiver='$log_username' OR sender='$log_username' 
    GROUP BY parent 
    ORDER BY parent, timestamp DESC";

また、集計関数を使用していないため、おそらく group by も必要ありません (投稿したコード以外で何かをしている場合を除きます)。

$sqlInbox = "
    SELECT sender, receiver, message, parent, rView
    FROM messages 
    WHERE receiver='$log_username' OR sender='$log_username' 
    ORDER BY parent, timestamp DESC";

最後に、それが私自身のコードである場合、メッセージに既読/未読フラグを追加し、それを order by 句でさらに使用することを検討します。

$sqlInbox = "
    SELECT sender, receiver, message, parent, rView
    FROM messages 
    WHERE receiver='$log_username' OR sender='$log_username' 
    ORDER BY readStatus, parent, timestamp DESC";

これにより、全体が 2 つのセクション (上部の未読メッセージと下部の既読メッセージ) に分割され、他の順序は以前と同じになります。

于 2013-10-24T23:40:53.660 に答える