不適切な表現のタイトルについてお詫び申し上げます。より良いものを考えることができませんでした。
メッセージを送受信するアプリがあります。送信用と受信用の 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」であるため、何らかの方法で組み合わせる必要があります。