Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从表中选择*但在1列上不同,在另一列上按顺序排序_Sql_Postgresql - Fatal编程技术网

Sql 如何从表中选择*但在1列上不同,在另一列上按顺序排序

Sql 如何从表中选择*但在1列上不同,在另一列上按顺序排序,sql,postgresql,Sql,Postgresql,我有一个消息表,其中有字段channel_number、body、created_at、recipeint_id和sender_id。我希望在channel_number和order by messages上有不同的消息。created_at 基本上我想在分页中显示所有频道,带有最新消息的频道将位于顶部。这就是我尝试过的: SELECT * FROM messages where id IN ( (SELECT channel_number, MIN(id) AS messages_id

我有一个消息表,其中有字段channel_number、body、created_at、recipeint_id和sender_id。我希望在channel_number和order by 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,消息表中的通道号没有uniq约束。在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);

在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);

这对我有好处

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

这对我有好处

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

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

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

请提供一些示例数据。您正在运行MySQL还是Postgres?请仅标记相关数据库。其postgres…在决定为每个频道编号保留哪一行时,是否希望按created_at排序,或者你是用其他方法选择不同的行,然后按通道号排序最终结果?我已经给出了答案,我想你会理解的。请包含一些示例数据。你是运行MySQL还是Postgres?请只标记相关的数据库。它的postgres…在决定为每个频道号码保留哪一行时,您是希望按created_at排序,还是以其他方式选择不同的行,然后按频道号码排序最终结果?我已经给出了答案,我想您会理解的