如何通过结果按照另一个订单的第一个记录订购?

时间:2013-08-09 19:36:10

标签: mysql select

我正在尝试创建自己的消息,就像手机中的短信一样。

我有一个像这样的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的记录组。

有谁知道怎么做?

感谢。

修改

实施例

如果我的身份证是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的那个是第二个部分。

1 个答案:

答案 0 :(得分: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