0

不適切な表現のタイトルについてお詫び申し上げます。より良いものを考えることができませんでした。

メッセージを送受信するアプリがあります。送信用と受信用の 2 つのテーブルがあります。

送信済:

id
status
sent_date
user_id
sent_message
sent_from
sent_to
another_field1
another_field2
comments

受け取った:

id
received_date
user_id
received_message
received_from
received_to
another_field3
another_field4
comments

この 2 つのテーブルに基づいて会話スレッドを表示しようとしています。user_id で 2 つを JOIN する必要があります。メッセージは会話順に表示されます。

ユニオンを使用してこれを行う他の同様の質問を見ましたが、列が異なるため、私の場合はうまくいくかどうかわかりません。PHPで行われた私の表示は、次のようになります。

{sent_to} との会話、日付順:

{sent_date} From me: {sent_message}
{received_date} From {received_from}: {received_message}
{received_date} From {received_from}: {received_message}
{sent_date} From me: {sent_message}

また、データベースを非効率的に構築した可能性があることも認識しています。構造をより適切に最適化する方法とその仕組みについての提案を歓迎します。ありがとうございました。

編集: Alain Collins の提案を試してみましたが、送信フィールドと受信フィールドを分離する方法がわかりません。私は実際に 2 つのテーブルをまとめようとしていますが、実際のフィールドを結合していません。ここに私がこれまでに持っているものがありますが、これは完全に間違っています:

SELECT *,
     case when sent.sent_date is not null then sent.sent_date 
     else received.received_date end AS date 
FROM sent JOIN received ON (received.user_id = sent.user_id)
WHERE sent.user_id = ".$_SESSION['id']." ORDER BY date ASC

これは、受信メッセージと送信メッセージを 1 つの行に結合しています。私はまだそれらを分離する必要があります。これを行う方法に関するヒントはありますか?送信メッセージと受信メッセージの両方を 1 つのテーブルに格納する方が、多少簡単でしょうか?

EDIT 2:明確にするために、両方のテーブルの列を分離したいと思います。つまり、返される ROWS には、送信された列または受信された列のいずれかのみが含まれている必要がありますが、上記のように、行は日付順に返される必要があります。したがって、次のような行を取得します。

Row 1: Array(Date, Sent_Message, Sent_From)
Row 2: Array(Date, Received_Message, Received_From)
Row 3: Array(Date, Received_Message, Received_From)
Row 4: Array(Date, Sent_Message, Sent_From)

したがって、2 つのテーブルに共通するのは、1) 会話を持つ user_id と 2) 日付の 2 つだけです。日付は現在「sent_date」と「received_date」であるため、何らかの方法で組み合わせる必要があります。

4

3 に答える 3

1

「sent_to=recd_from」で一致させるのではなく、「thread_id」を中心にテーブルを構成すると、より簡単に実行できる場合があります。新しいメッセージが作成されたとき (つまり、応答がない場合)、新しいメッセージ ID を持つ新しいスレッドを作成します。これに対する応答は元の thread_id を参照し、応答をメッセージ ID でソートしてスレッドの順序を取得できます。

于 2012-10-11T16:18:21.463 に答える
0

私がやろうとしていることに対する適切なクエリを見つけました:

(SELECT sent_date AS date, sent_message, sent_from 
FROM sent WHERE user_id = ".$_SESSION['id'].") 
UNION ALL (SELECT received_date AS date, received_message, received_from 
FROM received WHERE user_id = ".$_SESSION['id'].") 
ORDER BY date ASC
于 2012-10-12T00:24:40.517 に答える
0

基になるテーブルの日付を含む列を作成し、それで並べ替えます。

select case
  when sent.sent_date is not null then sent.sent_date
  else received.received_date
end as message_date
...
order by message_date;
于 2012-10-11T16:27:30.277 に答える