0

私はこの3つのテーブルを持っています:

messages:
id  conv    snd text    created
1   1   1   asdasd      2012-12-15 23:10:53
3   1   1   zzz         2013-01-18 12:37:44
4   1   1   ssss        2013-01-18 12:42:01


msg_status
id  msg user    status
1   1   1       mine
2   1   4       unread
3   3   1       mine
4   3   4       unread
5   4   1       mine
6   4   4       unread


conv_users
conv    user
1       1
1       4
2       1
2       4
2       5

これは私のサイトのメッセージング システムです。会話の最後のメッセージですべてのユーザーの会話を取得することを想定しているこの小さなクエリを除いて、すべての準備ができています。

つまり、ユーザー A に 2 つの会話があり、conv1 には 10 件のメッセージがあり、conv2 には 2 件のメッセージしかない場合、convId、messageId、messageText、messageDate などの 2 つの行を取得します。

しかし問題は、そのメッセージが各会話の最後のメッセージであることです。

これは私が行ったクエリですが、うまくいきません!

SELECT
  cu.conv,
  msg.snd,
  msg.text,
  mst.status,
  msg.created
FROM conv_users AS cu
  INNER JOIN messages AS msg
    ON cu.conv = msg.conv
  INNER JOIN msg_status AS mst
    ON msg.id = mst.msg
WHERE cu.user = 4
    AND mst.user = 4
ORDER BY msg.created DESC

追加するGROUP BY cu.convと、必要に応じて最後のメッセージではなく最初のメッセージが表示されます。

4

1 に答える 1

0

最大で派生クエリを使用してみてください

SELECT
  cu.conv,
  msg.snd,
  msg.text,
  mst.status,
  msg.created
FROM conv_users AS cu
  INNER JOIN (SELECT MAX(id), conv FROM messages GROUP BY conv )messages AS msg ON cu.conv = msg.conv
  INNER JOIN (SELECT MAX(id) , msg FROM msg_status GROUP BY msg) AS mst ON msg.id = mst.msg 
WHERE cu.user = 4
    AND mst.user = 4
ORDER BY msg.created DESC
于 2013-01-18T11:45:39.647 に答える