0

メッセージ テーブルを使用してチャット アプリケーションを作成します。

そのような特定のユーザーと通信するユーザーごとに3つの最近のメッセージを選択しようとします: ユーザー17には彼と通信する3人のユーザーがいます。各ユーザーの最後の3つのメッセージを選択します

17 22

22 17

22 17


19 17

17 19

19 17


21 17

17 21

17 21

クエリを作成しようとしましたが、3 つ以上のメッセージを選択した最初または最後のユーザーを除くすべてのユーザーで良い結果が得られました。クエリ:

    SELECT *, 
         DATE_FORMAT((FROM_UNIXTIME(m1.create_time)),'%k:%i, %d.%m.%Y') 
         as create_time_display
    FROM t_messages m1
    WHERE (m1.to =17 OR m1.from =17)  AND (
        SELECT COUNT(*) 
        FROM t_messages  m2
        WHERE m1.from = m2.from AND m2.id >= m1.id AND
        (m2.to = 17 OR m2.from = 17)
    ) <=3`

うまく機能させる方法はありますか?

ありがとう。

4

1 に答える 1

0
SELECT m1.*, 
       DATE_FORMAT(FROM_UNIXTIME(m1.create_time),'%k:%i, %d.%m.%Y') 
       as create_time_display
FROM t_messages m1
WHERE (m1.to=17 OR m1.from=17) AND 
      (SELECT COUNT(1) 
       FROM t_messages m2
       WHERE m2.id >= m1.id AND
            (m2.to=17 and m2.from=m1.from OR m2.from=17 and m2.to=m1.to)
      ) <=3

が自動インクリメントされたキーである場合t_messages.id、それを比較することは正しいです。そうでない場合は、t_messages.create_timesを比較する必要があります。

于 2013-09-02T08:37:05.900 に答える