2

テーブル MESSAGE を含むデータベースがあり、そこにはすべてのメッセージが含まれています。最後の会話メッセージをすべて見つける必要があります。

このテーブルには次のフィールドが含まれます。 Id (int) From (int) To (int) Date (date) Message (varchar)

最後のメッセージをすべて返すクエリを見つける必要があります。例えば:

1 -> 3 : This is a first message; yesterday
3 -> 1 : This is the last one; today
1 -> 2 : Another message with 1 and 2; some time
3 -> 5 : Some message i don't need; some time

私は見つける必要があります:

"3 -> 1 : This is the last one; today"
"1 -> 2 : Another message with 1 and 2; some time"

私が何を意味するのかが明確であることを願っています...次のクエリで、私が会話しているユーザーをすでに見つけることができます:

この例では、ユーザーは Id = 47 を持っています

select distinct m.To from MESSAGE m Where m.From = 47 union select distinct m2.from From MESSAGE m2 where m2.To = 47

ありがとう!

4

2 に答える 2

2

idを使用して「最後のメッセージ」を定義できると仮定すると、これで十分に機能すると思います。

select m.*
from message m join
     (select least(from, to) as p1, greatest(from, to) as p2, max(id) as maxid
      from message m
      group by least(from, to), greatest(from, to)
     ) mmax
     on m.id = mmax.maxid

これはIDを使用して、会話の最後のレコードを検索します。その後、再び参加してメッセージを取得します。

于 2012-10-05T15:21:41.317 に答える
2

男、これは本当に粗雑でかなり醜く見えますが、これはまともな出発点だと思います...「仮想化された」単一のテーブルにユーザーとユーザーを取得し、どちらか/両方の最大メッセージ日付を取得してから、それらを最大化しますユーザー ID ごとに、元のメッセージ テーブルと結合します。それが少なくとも希望です!:)「from」値はほぼ確実に予約済みのSQLキーワードであるため、実際にはfromIDまたはそのようなものである必要がありますが、とにかく...その注意事項があります...

*編集: 前の例をテストしましたが、これは正しくありませんでしたが、これはhttp://sqlfiddle.com/#!3/3f586/2の SQLFiddle ごとに機能します

select distinct fromid, toid, message
  from messages
  join (select distinct max(msgDate) msgdate, userid from
                    (select max(messageDate) msgdate, fromID userid
                       from messages
                      group by fromID
                      union 
                     select max(messageDate), toID userid
                       from messages
                      group by toID) as j group by userid ) as x
   on (messages.fromID=x.userid
       or messages.toID=x.userid)
  and messages.messageDate=x.msgdate
于 2012-10-05T14:32:11.590 に答える