【问题标题】:Group by with order by condition without using multiple sql sentenceGroup by with order by condition 不使用多个sql语句
【发布时间】:2017-02-08 12:31:14
【问题描述】:

表结构

 id
 user_id_1
 user_id_2
 message
 create_date

样本数据

 1 - 1 - 2 - "lorem ipsum" - 05.20.2016 15:12:11
 2 - 2 - 1 - "lorem ipsum dolor" - 05.20.2016 15:12:12
 3 - 3 - 1 - "lorem ipsum dolor sit" - 05.20.2016 15:12:13
 4 - 1 - 2 - "lorem ipsum dolor sit amet" - 05.20.2016 15:12:14

我有一张用于发送消息的表格。我想列出用户(id:1)的消息列表。我在下面使用sql语句。

SELECT * FROM messages 
WHERE (`user_id_1` = 1 OR `user_id_2` = 1)
GROUP BY IF(`user_id_1`=1,`user_id_2`,`user_id_1`)
ORDER BY create_date DESC

使用 group by 我只能获取每个用户一次,但问题是 GROUP BY 使用第一行。比如,对于user_id_1: 1,我想得到id:4,但它显示的是id:1

摘要:任务是列出用户与最后一条消息的对话。有没有办法只用一个 SQL 语句,而不使用"SELECT * FROM (SELECT * FROM ... ORDER BY) GROUP BY" 方式。

谢谢。

【问题讨论】:

    标签: mysql sql logic


    【解决方案1】:

    不要将GROUP BYSELECT * 一起使用。这是一种 SQL 反模式,大多数数据库都不支持。

    改为使用过滤来获取所需的行。这是一种方法:

    select m.*
    from messages m
    where 1 in (m.user_id_1, m.user_id_2) and
          m.create_date = (select max(m2.create_date)
                           from messages m2
                           where m2.user_id_1 = m.user_id2 or
                                 m2.user_id_2 = m.user_id1
                          );
    

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多