-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 的记录组。

有谁知道如何做到这一点?

谢谢。

编辑:

例子

如果我的 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 日之前。

因此,当我进行第一次排序时,它按另一个 id 排序,即 6,然后是 2。6 是一个部分,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 回答