たとえば、2人のユーザーが直接メッセージで話すと、あなたはメッセージの会話をします。その会話から最新のメッセージを選択して自分のメッセージの受信トレイにある会話リンクとして表示してください... FacebookやTwitterのメッセージの仕組みだけです。その後、最後に送信したメッセージをクリックして会話全体を表示できます。ユーザー間で送信されるすべてのメッセージが含まれていメッセージを会話にグループ化し、最初に受信トレイに表示するMySQLのクエリ
私のメッセージテーブルには、次の形式になります。
sourceUserIdがメッセージを送信したユーザのIDである、targetUserIdがメッセージを受信したユーザのIDである、体がありますメッセージは、メッセージが送信されたときのタイムスタンプです。私はabcとして身体を保持しています...そしてこの例を単純なものにする時間は1234ですが、それらはすべて異なる値です。
SELECT sourceUserId, targetUserId, body, UNIX_TIMESTAMP(time)
FROM `usermessages`
WHERE targetUserId = 1
OR sourceUserId = 1
ORDER BY id DESC
LIMIT 10
+----+--------------+--------------+--------+------+
| id | sourceUserId | targetUserId | body | time |
+----+--------------+--------------+--------+------+
| 1 | 1 | 2 | abc... | 1234 |
| 2 | 3 | 1 | abc... | 1234 |
| 3 | 3 | 1 | abc... | 1234 |
| 4 | 1 | 3 | abc... | 1234 |
| 5 | 2 | 1 | abc... | 1234 |
| 6 | 1 | 2 | abc... | 1234 |
| 7 | 3 | 1 | abc... | 1234 |
| 8 | 4 | 1 | abc... | 1234 |
+----+--------------+--------------+--------+------+
しかし、それだけではなく、最新の同じメッセージの会話の複数のインスタンスを返し、:
+----+--------------+--------------+--------+------+
| id | sourceUserId | targetUserId | body | time |
+----+--------------+--------------+--------+------+
| 1 | 1 | 2 | abc... | 1234 |
| 2 | 3 | 1 | abc... | 1234 |
| 3 | 3 | 1 | abc... | 1234 |
| 4 | 1 | 3 | abc... | 1234 |
| 5 | 2 | 1 | abc... | 1234 |
| 6 | 1 | 2 | abc... | 1234 |
| 7 | 3 | 1 | abc... | 1234 |
| 8 | 4 | 1 | abc... | 1234 |
| 9 | 5 | 4 | abc... | 1234 |
| 10 | 3 | 2 | abc... | 1234 |
+----+--------------+--------------+--------+------+
は、すべてのメッセージを取得します(送信および受信された)一人のユーザーのために、私はこのクエリを使用します2人のユーザ間の会話からのメッセージ。例えば2,3行目と4行目はすべて同じ会話を正確に表示します。
私は、クエリは、次のクエリでちょうどtargetUserId(ユーザーが受信したメッセージ)のために働くことを得ることができます、これで
SELECT sourceUserId, targetUserId, body, UNIX_TIMESTAMP(time)
FROM `usermessages`
WHERE targetUserId = 1
GROUP BY sourceUserId
ORDER BY id DESC
LIMIT 10
+----+--------------+--------------+--------+------+
| id | sourceUserId | targetUserId | body | time |
+----+--------------+--------------+--------+------+
| 2 | 3 | 1 | abc... | 1234 |
| 5 | 2 | 1 | abc... | 1234 |
| 8 | 4 | 1 | abc... | 1234 |
+----+--------------+--------------+--------+------+
と反対(ユーザーによって送信されたメッセージ)WHEREことに注意して
SELECT sourceUserId, targetUserId, body, UNIX_TIMESTAMP(time)
FROM `usermessages`
WHERE sourceUserId = 1
GROUP BY targetUserId
ORDER BY id DESC
LIMIT 10
+----+--------------+--------------+--------+------+
| id | sourceUserId | targetUserId | body | time |
+----+--------------+--------------+--------+------+
| 1 | 1 | 2 | abc... | 1234 |
| 4 | 1 | 3 | abc... | 1234 |
+----+--------------+--------------+--------+------+
が、私は二つの結果を組み合わせて、group by targetUserId, sourceUserId
場合は1から(2,3,4)へのすべての送信メッセージがグループ化されているので、それは正しい結果が得られていません:GROUP BYはちょうど入れ替わっています。私は、このようなクエリのようになりために、私は擬似コードを考える
を返したい何
:
SELECT sourceUserId, targetUserId, body, UNIX_TIMESTAMP(time)
FROM `usermessages`
WHERE sourceUserId = 1
OR targetUserId = 1
GROUP BY (If targetUserId != 1), (If sourceUserId != 1)
ORDER BY id DESC
LIMIT 10
+----+--------------+--------------+--------+------+
| id | sourceUserId | targetUserId | body | time |
+----+--------------+--------------+--------+------+
| 1 | 1 | 2 | abc... | 1234 |
| 2 | 3 | 1 | abc... | 1234 |
| 8 | 4 | 1 | abc... | 1234 |
+----+--------------+--------------+--------+------+
'GROUP BY targetUserId'を実行すると、 'target user'ごとに1つのメッセージしか表示されません。表示される出力とはまったく異なります。最初のクエリが「同じ会話の複数のインスタンス」を返すとします。メッセージがどの「会話」に属するのかをどのように識別しますか?あなたの希望する出力があなたのサンプルテーブルにどのように関係しているかわかりません。 – eggyal
@eggyal私は出力を表示していないことを知っていますか?出力は私が達成しようとしているものです。 – Dan
テーブルが "* userIdが1 *"の場合、テーブルを "理想的には以下を返しますか?"それは何ですか? – eggyal