-1

電話の SMS のような独自のメッセージを作成しようとしています。

このようなMySQLテーブルがあります

id                  (the message id)
from_member_id      (the id of the member who sent this message)
to_member_id        (the id of the member who the message was sent to)
date sent           (the date it was sent)
active              (if this message is deleted or active)
text                (the text)

そして、私は特別な方法で情報を取得したいと考えています。

最初に、あなたではない ID でソートする必要があります (「他の」ID と呼びます)。次に、その順序付けのセクションごとに、最上位のレコード (最新の日付である必要があります) を取得し、そのレコードの日付値でセクションを並べ替える必要があります。

これで最初の注文を行うことができます:

SELECT
  from_member_id,
  to_member_id,
  (CASE WHEN from_member_id = ? THEN to_member_id ELSE from_member_id END CASE) AS conversation_member_id,
  date_sent
FROM table
WHERE from_member_id = ?
OR to_member_id = ?
ORDER BY conversation_member_id DESC, date_sent DESC

?私のIDです。

しかし、問題は、2 番目の順序付けを行う方法です。ここでは、セクションをトップ レコードの日付 (最新の日付である必要があります) で並べ替える必要があります。セクションと言うときは、同じ 'other' ID を持つレコードのグループを意味することに注意してください。

誰もこれを行う方法を知っていますか?

ありがとう。

編集:

私のIDが5の場合:

From To   Date
5     6   july 28
6     5   july 7
6     5   july 7
5     2   july 26
5     2   july 26
2     5   july 26

したがって、7 月 28 日の日付が一番上に来るはずです。これは、そのセクションに 7 月 26 日より前の日付があるにもかかわらず、それが最も最近に発生したためです。

したがって、最初の順序付けを行うと、もう 1 つの ID、つまり 6、次に 2 で順序付けされます。6 の ID は 1 つのセクションであり、2 の ID は 2 番目のセクションです。

4

1 に答える 1

1

私は MS SQL の専門家ですが、これで十分明確だと思います。

CREATE TABLE #Messages
(
FromID  INT NOT NULL,
ToID    INT NOT NULL,
Date    DATETIME2(0) NOT NULL,
Text    VARCHAR(200) NOT NULL
)
INSERT INTO #Messages (FromID, ToID, Date, Text) VALUES
    (5, 6, '2013-07-28 12:00', 'A'),
    (6, 5, '2013-07-07 02:00', 'B'),
    (6, 5, '2013-07-07 01:00', 'C'),
    (5, 2, '2013-07-26 03:00', 'D'),
    (5, 2, '2013-07-26 02:00', 'E'),
    (2, 5, '2013-07-26 01:00', 'F')

DECLARE @Me INT = 5
SELECT
    M.FromID, M.ToID, M.Date, M.Text
FROM
    #Messages AS M
    INNER JOIN
        (
        SELECT
            CASE WHEN FromID = @Me THEN ToID ELSE FromID END AS ID,
            MAX(Date) AS MostRecentDate
        FROM
            #Messages
        GROUP BY
            CASE WHEN FromID = @Me THEN ToID ELSE FromID END
        ) AS Seq ON CASE WHEN M.FromID = @Me THEN M.ToID ELSE M.FromID END = Seq.ID
ORDER BY
    Seq.MostRecentDate DESC, M.Date DESC
于 2013-08-09T19:54:17.783 に答える