mysql - 排序列表,保留分组字符

标签 mysql group-by sql-order-by

我有一个“消息”列表

  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 查询时:

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

关于mysql - 排序列表,保留分组字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40896063/

相关文章:

mysql - Mysql中的热门项目

python - Pandas groupby 和 bool 选择

mysql - 对嵌套 SQL Oracle 查询中的多行值求和

mysql - groupby 创建的表中某列的总和

postgresql - 按与 "now"的绝对距离对时间戳(包括 future )进行排序

mysql - Order by multiple OR Mysql

MySQL ORDER BY 不能使用 2-word 别名

php - 当我将其存储为 mysql 表列中的多类别时,获取单个类别

mysql - 数据库休眠导致异常

MySQL在另一个过程中调用一个过程并将值插入临时表