Postgresql收件箱查询

前端之家收集整理的这篇文章主要介绍了Postgresql收件箱查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个如下所示的Messages表:
  1. Messages
  2. +-----+------------+-------------+--------------+
  3. | id | sender_id | receiver_id | created_at |
  4. +-----------------------------------------------+
  5. | 1 | 1 | 2 | 1/1/2013 |
  6. | 2 | 1 | 2 | 1/1/2013 |
  7. | 3 | 2 | 1 | 1/2/2013 |
  8. | 4 | 3 | 2 | 1/2/2013 |
  9. | 5 | 3 | 2 | 1/3/2013 |
  10. | 6 | 5 | 4 | 1/4/2013 |
  11. +-----------------------------------------------+

如果’thread’是给定sender_id和receiver_id之间的一组消息,我希望查询返回最近10个线程的最新10条消息,其中sender_id或receiver_id是给定的id.

给定user_id为5的预期输出

  1. +-----+------------+-------------+--------------+
  2. | id | sender_id | receiver_id | created_at |
  3. +-----------------------------------------------+
  4. | 1 | 5 | 2 | 1/4/2013 |
  5. | 2 | 5 | 2 | 1/4/2013 |
  6. | 3 | 2 | 5 | 1/4/2013 |
  7. | 4 | 3 | 5 | 1/4/2013 |
  8. | 5 | 5 | 2 | 1/3/2013 |
  9. | 6 | 5 | 4 | 1/3/2013 |
  10. +-----------------------------------------------+

例如,用户5和2之间(上面有4个)和10个线程的限制(上面有3个)之间的最多10个消息的限制.

我一直在使用子查询尝试这种查询,但没有设法获得不同线程数量的第二个限制.

  1. SELECT * FROM (SELECT DISTINCT ON (sender_id,receiver_id) messages.*
  2. FROM messages
  3. WHERE (receiver_id = 5 OR sender_id = 5) ORDER BY sender_id,receiver_id,created_at DESC)
  4. q ORDER BY created_at DESC
  5. LIMIT 10 OFFSET 0;

我正在考虑创建一个新的Thread表,其中包含一个thread_id字段,该字段将是sender_id receiver_id的串联,然后只是加入Messages,但我有一种偷偷摸摸的怀疑,它只能用一个表来实现.

我没有对此进行测试,但看起来您忘记了子查询中的LIMIT 10,它为您提供了10个最近的线程:
  1. SELECT
  2. *
  3. FROM
  4. (SELECT DISTINCT ON
  5. (sender_id,receiver_id) messages.*
  6. FROM
  7. messages
  8. WHERE
  9. (receiver_id = 5 OR sender_id = 5)
  10. ORDER BY
  11. sender_id,created_at DESC
  12. LIMIT
  13. 10)
  14. q
  15. ORDER BY
  16. created_at DESC
  17. LIMIT
  18. 10
  19. OFFSET
  20. 0;

(我已经很好地打印了sql,因此更容易分辨出发生了什么.)

猜你在找的Postgre SQL相关文章