次のようなメッセージテーブルがあります。
Messages
+-----+------------+-------------+--------------+
| id | sender_id | receiver_id | created_at |
+-----------------------------------------------+
| 1 | 1 | 2 | 1/1/2013 |
| 2 | 1 | 2 | 1/1/2013 |
| 3 | 2 | 1 | 1/2/2013 |
| 4 | 3 | 2 | 1/2/2013 |
| 5 | 3 | 2 | 1/3/2013 |
| 6 | 5 | 4 | 1/4/2013 |
+-----------------------------------------------+
'thread'が特定のsender_idとreceiver_idの間のメッセージのグループである場合、sender_idまたはreceiver_idのいずれかが特定のIDである最新の10スレッドの最新の10メッセージを返すクエリが必要です。
指定されたuser_idが5の場合に期待される出力:
+-----+------------+-------------+--------------+
| id | sender_id | receiver_id | created_at |
+-----------------------------------------------+
| 1 | 5 | 2 | 1/4/2013 |
| 2 | 5 | 2 | 1/4/2013 |
| 3 | 2 | 5 | 1/4/2013 |
| 4 | 3 | 5 | 1/4/2013 |
| 5 | 5 | 2 | 1/3/2013 |
| 6 | 5 | 4 | 1/3/2013 |
+-----------------------------------------------+
たとえば、ユーザー5と2の間の最大10メッセージ(4つ以上)と10スレッドの制限(3つ以上)。
私はサブクエリを使用してこの種のクエリを試してきましたが、個別のスレッドの数の2番目の制限を取得できませんでした。
SELECT * FROM (SELECT DISTINCT ON (sender_id, receiver_id) messages.*
FROM messages
WHERE (receiver_id = 5 OR sender_id = 5) ORDER BY sender_id, receiver_id,
created_at DESC)
q ORDER BY created_at DESC
LIMIT 10 OFFSET 0;
sender_id + Receiver_idを連結したthread_idフィールドを含む新しいThreadテーブルを作成し、Messagesに参加することを検討していますが、1つのテーブルで実行できるはずだという卑劣な疑いがあります。