【问题标题】:Postgresql error: column must appear in the GROUP BY clause or be used in an aggregate functionPostgresql 错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用
【发布时间】:2020-11-04 01:18:09
【问题描述】:

我想从中获取“user1”最近联系人的消息表,现在该表如下所示:

| id | receiver | sender | time       |
|----|----------|--------|------------|
| 1  | user1    | host1  | 2020-07-02 |
| 2  | host2    | user1  | 2020-07-03 |
| 3  | user3    | host3  | 2020-07-04 |

我设法通过使用 mysql 得到了预期的结果:

SELECT CASE WHEN receiver = 'user1' THEN sender ELSE receiver END AS id, max(time) AS time 
FROM message WHERE receiver = 'user1' OR sender = 'user1' 
GROUP BY CASE WHEN receiver = 'user1' THEN sender ELSE receiver END;

但是当我在 postgres 上运行此查询时,我收到错误:Postgresql 错误:列接收器必须出现在 GROUP BY 子句中或用于聚合函数中。有什么办法可以解决这个问题?

【问题讨论】:

  • 您的查询按照 PostgreSQL 编写的方式工作:db-fiddle.com/f/c648pLyq1N4yQTDcBMUfeM/0
  • 是的,但是当我在 node-postgres 模块上使用它时,我得到了那个错误
  • 请更新您的问题并添加您的节点代码。

标签: sql postgresql node-postgres


【解决方案1】:

我建议distinct on:

select distinct on ( case when receiver = 'user1' then sender else receiver end ) m.*
from messages m
where 'user1' in (receiver, sender)
order by (case when receiver = 'user1' then sender else receiver end), time desc;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多