1

私は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と、すべてのスレッドのすべてのメッセージが表示されます

4

2 に答える 2

0

あなたが実際に何を求めているのか少し混乱しましたが、これを見てください:

SELECT `assocMessages`.*, `messageThreads`.`threadCreatedOn`, `messages`.`messageBody`, `messages`.`messageSent` 
FROM `assocMessages`
LEFT JOIN `messageThreads` ON `messageThreads`.`threadID` = `assocMessages`.`threadID`
LEFT JOIN `messages` ON `messageThreads`.`threadID` = `messages`.`threadID` AND `assocMessages`.`accountID`=`messages`.`accountID`
WHERE `assocMessages`.`accountID` =1
ORDER BY `messages`.`messageSent` DESC

これはあなたがやろうとしていることですか?私は持っているメッセージを改造しました

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
3           1           1           Third Message   2013-05-01 12:02:00

SQL クエリの結果は次のとおりです。

accountID   threadID    threadCreatedOn     messageBody     messageSent
1           1           2013-05-01 12:00:00     Third Message   2013-05-01 12:02:00
1           1           2013-05-01 12:00:00     First Hi    2013-05-01 12:00:00
于 2013-05-01T17:21:30.240 に答える