2

メールの会話を保持するデータベースがあります

table "conversations"
ID    SUBJECT
1     meeting on Friday

table "conversations_mails"
ID    CONVERSATION_ID    TEXT                               CREATED_ON
1     1                  "What about a meeting on Friday?"  2012-08-05 10:00:00
2     1                  "that's a good idea!"              2012-08-10 15:00:00

ここで、会話の概要ページを表示して、最新の返信の切り捨てられたテキスト バージョンを表示したいと考えています。例えば

"Meeting on Friday"
That's a good ... 

私はGROUP BYを介してこれを達成しようとしています。しかし、私が得たのは、テーブルの最初の返信 (「金曜日の会議はどうですか」) であり、最後の「それは良い考えです」ではありません。

これは私のSQL文です:

SELECT *, MAX(conversations_mails.created_on) As conversation_last_reply,
  MAX(conversations_mails.id) AS maxId
FROM conversations 
LEFT JOIN conversations_mails ON conversations_mails.conversation_id = conversations.id 
GROUP BY conversations.id 
ORDER BY conversation_last_reply DESC

MAX() を介して最高の ID を取得する方法は知っていますが、対応する TEXT エントリはどうでしょうか?

ありがとうございました!

4

2 に答える 2

2

これを試して-

SELECT *, MAX(conversations_mails.created_on) As conversation_last_reply,
  MAX(conversations_mails.id) AS maxId
FROM conversations 
LEFT JOIN conversations_mails ON conversations_mails.conversation_id = conversations.id 
WHERE conversations_mails.id = (select max(conversations_mails.id) from conversations_mails where conversations_mails.conversation_id = conversations.id)
GROUP BY conversations.id 
ORDER BY conversation_last_reply DESC
于 2012-08-10T17:12:46.757 に答える
1

JOINサブクエリを使用する (geeky_bat が示唆するように) か、古い行を除外するために別のクエリを追加するという 2 つのオプションがあります。another でそれを行う方法は次のJOINとおりです。

SELECT 
  cm.created_on AS conversation_last_reply,
  cm.id AS maxId, 
  cm.conversation_text
FROM conversations c
  LEFT OUTER JOIN conversations_mails cm
  ON cm.conversation_id = c.id 
  LEFT OUTER JOIN conversations_mails cm_newer
  ON cm_newer.conversation_id = c.id
  AND cm_newer.created_on > cm.created_on
WHERE cm_newer.created_on IS NULL
GROUP BY c.id 
ORDER BY cm.created_on DESC

http://sqlfiddle.com/#!2/5dfea/18

于 2012-08-10T17:33:59.330 に答える