【问题标题】:How to select * from table but distinct on 1 column and order by on another column如何从表中选择 * 但在一列上不同并在另一列上排序
【发布时间】:2020-02-24 09:04:17
【问题描述】:

我有一个包含字段 channel_number、body、created_at、recipint_id 和 sender_id 的消息表我希望在 channel_number 上有不同的消息并按 messages.created_at 排序

基本上我想在分页中显示所有频道,最新消息的频道将在顶部。这是我尝试过的:

SELECT * 
FROM messages 
where id IN ( (SELECT channel_number, MIN(id) AS messages_id 
               FROM messages 
               GROUP BY channel_number
              ) as a
           ) a.messages_id 
ORDER BY a.messages_id DESC;

我已经为此工作了几个小时并进行了许多查询,但没有成功,因为在结果中我需要消息的所有字段而不是选定的频道和 ID。

编辑 - 我正在使用 postgres,消息表中的 channle_number 没有 uniq 约束

【问题讨论】:

  • 请提供一些示例数据。
  • 您运行的是 MySQL 还是 Postgres?请仅标记相关数据库。
  • 它的 postgres...
  • 在决定为每个 channel_number 保留哪一行时,您希望它按 created_at 排序,还是您以其他方式选择哪些不同的行,然后按 channel_number 对最终结果排序?
  • 我已经回答了我是怎么做的,我想你会明白的

标签: sql postgresql


【解决方案1】:

在 PostgreSQL 中你可以这样做:

select distinct on (channel_number) m.*
from messages m
order by channel_number, id desc;

你也可以使用关联子查询:

select m.*
from messages m
where m.id = (select max(m1.id) from messages m1 where m1.channel_number = m.channel_number);

【讨论】:

    【解决方案2】:

    按列 2 asc/desc 从表顺序中选择不同的 column_1;

    【讨论】:

      【解决方案3】:

      这对我很有效

      SELECT *
      FROM messages
      where (channel_number, id) IN (select channel_number, MIN(id) AS last_message_id
                                      FROM "messages"
                                      WHERE (sender_id = 3 OR recipient_id =2)
                                     )
      GROUP BY "messages"."channel_number"
      ORDER BY created_at DESC
      

      【讨论】:

        猜你喜欢
        • 2017-11-19
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-10
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        相关资源
        最近更新 更多