私はSQLステートメントを持っています
SELECT *
FROM `assocMessages`
LEFT JOIN `messageThreads` ON `messageThreads`.`threadID` = `assocMessages`.`threadID`
LEFT JOIN `messages` ON `messageThreads`.`threadID` = `messages`.`threadID`
WHERE `assocMessages`.`accountID` =1
GROUP BY `messageThreads`.`threadID`
ORDER BY `messages`.`messageSent` DESC
message threads現在のユーザーが関連付けられているリストを取得するように設計されています。messageまた、見つかったものに関連付けられている最新のものを取得するように設計されていmessage threadsますが、見つかったもので送信された最初のメッセージのみを表示していますmessage thread。ステートメントを追加しましたORDER BY messages.messageSent DESCが、そこにあるか、方向がASCまたはであるかに関係なく、最初に送信されたDESCものだけが表示されます。message私に何ができるか知っている人はいますか?n+1 選択の問題が発生しないように、単一の SQL ステートメントにまとめようとしています。
編集
テーブルを逆にしようとしたところ、最初は逆にFROM messagesなり、assocMessages後でテーブルが結合されます
編集
関連メッセージ:
+-----------+----------+
| accountID | threadID |
+-----------+----------+
| 1 | 1 |
+-----------+----------+
| 2 | 1 |
+-----------+----------+
メッセージスレッド:
+----------+---------------------+
| threadID | threadCreatedOn |
+----------+---------------------+
| 1 | 2013-05-01 12:00:00 |
+----------+---------------------+
メッセージ:
+-----------+----------+-----------+-------------+---------------------+
| messageID | threadID | accountID | messageBody | messageSent |
+-----------+----------+-----------+-------------+---------------------+
| 1 | 1 | 1 | First Hi | 2013-05-01 12:00:00 |
+-----------+----------+-----------+-------------+---------------------+
| 2 | 1 | 2 | Second Hi | 2013-05-01 12:01:00 |
+-----------+----------+-----------+-------------+---------------------+
そのため、クエリを実行すると、スレッドのリスト ( accountID1 が登録されている) が返され、最新のmessage2messageIDによって送信されたaccountID2が返されます。
返されるもの:
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
| accountID | threadID | threadCreated | messageID | messageBody | messageSent | threadID | accountID |
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
| 1 | 1 | 2013-05-01 12:00:00 | 1 | First Hi | 2013-05-01 12:00:00 | 1 | 1 |
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
返すべきもの:
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
| accountID | threadID | threadCreated | messageID | messageBody | messageSent | threadID | accountID |
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
| 1 | 1 | 2013-05-01 12:00:00 | 2 | Second Hi | 2013-05-01 12:01:00 | 1 | 2 |
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
を削除すると返されるものgroup by:
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
| accountID | threadID | threadCreated | messageID | messageBody | messageSent | threadID | accountID |
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
| 1 | 1 | 2013-05-01 12:00:00 | 2 | Second Hi | 2013-05-01 12:01:00 | 1 | 2 |
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
| 1 | 1 | 2013-05-01 12:00:00 | 1 | First Hi | 2013-05-01 12:00:00 | 1 | 1 |
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
最初の s は、関連付けaccountIDから返されているため同じです。messageThreads
最終編集(とりあえず)
をドロップするGROUP BY messageThreads.threadIDと、すべてのスレッドのすべてのメッセージが表示されます