0

ユーザー間のプライベートメッセージシステムを開発する必要があり、これが私がやりたいことです:

次のようなテーブルがあります。

id | from_user_id | to_user_id | message
1  | 1            | 2          | Hey n°1 !    <-- Me with user n°2
2  | 2            | 1          | Hey n°2 !    <-- Me with user n°2
4  | 1            | 3          | Hey n°3 !    <-- Me with user n°3
3  | 3            | 2          | Hey n°4 !

私はユーザー n°1 であると仮定します。ディスカッションとして、「ユーザーごとにグループ化」し、id 順に並べた最後のメッセージのリストを取得したいと考えています。

id | with_user_id | message
4  | 3            | Hey n°3 !
2  | 2            | Hey n°2 !

私は次のようなリクエストを試みました:

SELECT id, message,
       (CASE WHEN from_user_id = 1 THEN to_user_id ELSE from_user_id END) AS with_user_id
FROM privates
WHERE from_user_id = 1 OR to_user_id = 1
GROUP BY with_user_id
ORDER BY id DESC

しかし、私はこれを取得しています:

id | with_user_id | message
4  | 3            | Hey n°3 !
1  | 2            | Hey n°1 !

問題は、最後のメッセージではなく、ユーザー番号 1 の最初のメッセージを選択することです。

4

2 に答える 2

1

注:サブクエリでは OrderBy 句が許可されていないため、これは MSSQL では機能しません。MSSQL を使用している場合は、この質問の回答と同様の方法を使用できます。

group by ステートメントはメッセージ 1 と 2 をグループ化し、最初のものを選択するため、group by の前に order by を適用する必要があります。次のようなことを試してください:

Select SQ.*
FROM (
    SELECT id, message,
       (CASE WHEN from_user_id = 1 THEN to_user_id ELSE from_user_id END) AS with_user_id
    FROM privates
    WHERE from_user_id = 1 OR to_user_id = 1
    ORDER BY id DESC
) AS SQ
GROUP BY SQ.with_user_id

この方法で注文すると、特定の会話の最新のメッセージのみが取得されます。

于 2013-11-14T16:25:13.987 に答える
0

ユーザーとのダイアログを作成するためにすべてのメッセージが必要なように見えます。次の選択を試してください

select id, from_user_id, to_user_id, message,
  from privates
 where from_user_id = 1
    or to_user_id = 1
 order by case
              when from_user_id = 1 then
               to_user_id
              else
               from_user_id
          end,
          id desc
于 2013-11-14T16:34:48.973 に答える