排序列表,保留分组字符

sorting a list, preserving the grouped character

我有一个列表 "messages"

  recei | sender |date(timestamp)| id
--------+--------+---------------+----
 Nickel | Lisett |   3.10.1991   | 1
  Tom   | Nickel |   4.12.1991   | 2
 Lisett | Nickel |   03.9.1991   | 3
 Nickel | Lisett |   01.9.1991   | 4
  Tom   | Nickel |   15.9.1991   | 5
 Nickel |  Tom   |   2.10.1991   | 6

当我这样做时 sql-query:

SELECT *, IF(recei='Nickel', sender, recei ) AS name
FROM messages WHERE recei='Nickel' OR sender='Nickel'
ORDER BY name, date;

我得到以下结果

           name           |  recei | sender |  date   |id
 (=interlocutor of Nickel)|        |        |         |
--------------------------+--------+--------+---------+----
           Lisett         | Nickel | Lisett |3.10.1991| 1
           Lisett         | Lisett | Nickel |03.9.1991| 3
           Lisett         | Nickel | Lisett |01.9.1991| 4
           Tom            |   Tom  | Nickel |4.12.1991| 2
           Tom            |   Tom  | Nickel |15.9.1991| 5
           Tom            | Nickel |  Tom   |2.10.1991| 6

但我想让 Nickel 的最后一位对话者位于列表顶部:所以我想订购组 "Lisett"(名称为 (Interlocutor) Lisett 的行)和 "Tom" 最早的日期。在这种特殊情况下,将组 "Tom" 置于组 "Lisett" 之上。所以说在组内寻找最早的日期,并将日期较早的组放在另一个组之上。这可能吗?

您可以使用内部联接获取 date_max 并使用此列进行排序

SELECT a.* , IF(a.recei='Nickel', a.sender, a.recei ) AS name
FROM messages as a 
INNER JOIN ( SELECT  IF(recei='Nickel', sender, recei ) as name, max(date) date_max
      FROM messages WHERE recei='Nickel' OR sender='Nickel'
      group by name ) t on t.name = IF(a.recei='Nickel', a.sender, a.recei )
WHERE a.recei='Nickel' OR a.sender='Nickel'
ORDER BY t.date_max, name, a.date