1

現在のユーザーのすべての受信メールと送信メールを 1 つのクエリで取得する必要があるメール テーブルがあります。php が結果をループするとき、送受信された最新のメッセージに基づいて 1 つのメイン ビジュアルを構築し、その最新のメッセージに関連する以前のメッセージ ビジュアルを構築する必要があります (これはページの下にある最新のメッセージの下に表示されます)。 . 私が持っているメールテーブルは次のように設定されています:

d(auto_incr), from_user(user id number), to_user(user id number),
orig_mess(id number of the first message in conversation),
status(0 for unread, 1 for read)

他のメール受信トレイと同様に、次のように並べ替えられた結果を取得する必要があります。

2) ログインしているユーザーに送信されたメッセージまたはログインしているユーザーから送信されたメッセージ (すべて ID 順) を読み取り、もちろん最新の後の各会話に関連する以前のメッセージを読み取ります。

これが私がこれまでに試したことです:

     $result = mysql_query("(SELECT id FROM Mail WHERE Mail.to_user='37' AND   
       Mail.status='0' ORDER BY Mail.id DESC) UNION (SELECT id FROM Mail WHERE   
(Mail.to_user='37' AND Mail.status='1') OR   
(Mail.from_user='37') ORDER BY Mail.id DESC)")or die(mysql_error());

クエリを使用して各会話の最新メッセージを取得し、その後、各会話に対して別のクエリを実行して、探している結果を達成しました。この方法の問題点は、ユーザーのメールボックスに 20 件の会話がある場合、それらすべてを表示するために 21 件のクエリが発生することです。これをどのように達成できるか、またはメールシステムを設定するためのより良い方法があるかどうかについての助けをいただければ幸いです。

これを達成するための信頼できる方法はまだ思いつきません。光を当てることができる人はいますか?

4

1 に答える 1

0

このようなものが機能するはずだと思います。これにより、送信メッセージと受信メッセージの両方が同じクエリでプルされ、最新の未読メッセージが最初に、次に最新の既読メッセージの会話で並べ替えられます。

SELECT   <any fields you want>

FROM     Mail as m

     JOIN

     (SELECT  orig_mess, id, status
      FROM    Mail 
      WHERE   Mail.from_user='37' OR Mail.to_user='37'
      ) as latest ON m.orig_mess = latest.orig_mess
      AND latest.id = (SELECT  id  
                       FROM    Mail  
                       WHERE   from_user='37' OR to_user='37' 
                               orig_mess = latest.orig_mess
                       ORDER BY status asc, id DESC  
                       LIMIT 1)

WHERE    m.from_user='37' OR m.to_user='37'   

ORDER BY latest.status, latest.id DESC, m.status, m.id DESC
于 2013-01-11T18:23:06.283 に答える