2012-03-28 16 views
0

私は受信ボックスシステムを作成しました。サインインしたユーザーは、他のサインインしたユーザーにメッセージを送信できます。データベースのusermessageテーブルには、useridと2. messageidという2つのフィールドがあります。以下は、この表からの抜粋です。MysqlとPHPの受信トレイの更新

userid | messageid 
12  | 1 
13  | 1 
14  | 2 
15  | 2 
12  | 3 
15  | 3 
12  | 4 
14  | 4 

上記の状況では、ユーザー '12'がユーザー '13'にメッセージを送信します。メッセージID「1」をテーブルの一番下に移動して、ユーザー「12」または「13」が自分のメールボックスをチェックしているときに、メッセージID「1」を最近の会話として受信トレイの上部に表示する必要があります。これまで私はmessageid '1'を削除し、各ユーザーIDの新しいクエリとして挿入することでこれを達成できました。これは私のコードです:

DELETE FROM usermessage WHERE userid = '12' and messageid = '1'; 
INSERT INTO usermessage SET userid = '12', messageid = '1'; 
DELETE FROM usermessage WHERE userid = '13' and messageid = '1'; 
INSERT INTO usermessage SET userid = '13', messageid = '1'; 

これは1つのクエリで可能ですか?これまでのところ、私は問題に関連したスタックフローで明確な答えを見つけることができませんでした。

+1

OMG。データの正規化と適切な相対DB設計について聞いたことがありますか? – heximal

+0

これは、(UP UPDATE CURRENT_TIMESTAMPのようなものを使用して)usermessageテーブルのタイムスタンプフィールドと受信ボックスを表示するためのセレクタでより賢明なORDER BYを使用する方がずっと良いでしょう。 – cmbuckley

+0

は新しい行を作成するだけで12に送信してはいけません。メッセージIDをリサイクルしないでください。 –

答えて

0

SORT文を使用せずに行を照会すると、作成された時間順でソートされることは保証されません。これはMySQLがあなたに今のような振る舞いを与えるチャンスです。

したがって、客観的なソートルールを発見または作成する必要があります。メッセージのタイムスタンプ、またはあなたの[usermessage]テーブルの新しいタイムスタンプ列にすることができます。

削除と挿入のたびにMySQLが[usermessage]テーブルのインデックスを更新する必要があるため、行を削除して再作成するとMySQLのプロセスコストが影響を受けることにも注意してください。

+0

ありがとうございました。タイムスタンプは明確な答えです。 – Hari

関連する問題