私は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 |
+-----------+----------+-----------+-------------+---------------------+
そのため、クエリを実行すると、スレッドのリスト ( accountID
1 が登録されている) が返され、最新のmessage
2messageID
によって送信されたaccountID
2が返されます。
返されるもの:
+-----------+----------+---------------------+-----------+-------------+---------------------+----------+-----------+
| 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
と、すべてのスレッドのすべてのメッセージが表示されます