Postgres限制另一个表中WHERE IN id中每个行的行数

黑背

我有一个消息传递应用程序,我需要在其中返回用户所属的所有对话以及与每个对话相关联的消息。我想限制每次对话的消息数量。

表结构如下:

用户数

| id   | name | email    | created_at |
|------|------|----------|------------|
| 1    | Bob  | [email protected]  | timestamp  |
| 2    | Tom  | [email protected]  | timestamp  |
| 3    | Mary | [email protected]  | timestamp  |

留言内容

| id   | sender_id | conversation_id  | message | created_at |
|------|-----------|------------------|---------|------------|
| 1    | 1         | 1                | text    | timestamp  |
| 2    | 2         | 2                | text    | timestamp  |
| 3    | 2         | 1                | text    | timestamp  |
| 4    | 3         | 3                | text    | timestamp  |

对话内容

| id | created_at |
|----|------------|
| 1  | timestamp  |
| 2  | timestamp  |
| 3  | timestamp  |

对话用户

| id | user_id | conversation_id |
|----|---------|-----------------|
| 1  | 1       | 1               |
| 2  | 2       | 1               |
| 3  | 2       | 2               |
| 3  | 3       | 2               |
| 4  | 3       | 3               |
| 5  | 1       | 3               |

我想加载用户(id 1)所在的所有对话(在示例中-对话1和3)。对于每次对话,我都需要与之关联的消息,并按分组conversation_id,排序created_at ASC我当前的查询处理:

SELECT
    *
FROM
    messages
WHERE
    conversation_id IN (
        SELECT
            conversation_id
        FROM
            conversations_users
        WHERE
            user_id = 1
    )
ORDER BY
    conversation_id, created_at ASC;

但是,这会将大量数据粘贴到内存中。因此,我想限制每次对话的消息数量。

我已经查看过rank()ROW_NUMBER()但是不确定如何实现它们/如果需要它们。

专线小巴

您确实可以使用row_number()以下查询将为您提供给定用户每次会话的最后10条消息:

select *
from (
    select 
        m.*, 
        row_number() over(
            partition by cu.user_id, m.conversation_id 
            order by m.created_at desc
        ) rn
    from messages m
    inner join conversations_users cu 
        on  cu.conversation_id  = m.conversation_id 
        and cu.user_id = 1
) t
where rn <= 10
order by conversation_id, created_at desc

笔记:

  • 我将子查询in转换为常规查询join,因为我认为这是表达需求的一种更整洁的方式

  • 我在分区子句中添加了用户ID。因此,如果删除where对用户进行过滤子句,则将获得每个用户对话的最后10条消息

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Postgres中删除另一个引用的表

来自分类Dev

使用NOT IN的另一个表中的WHERE子句

来自分类Dev

根据另一个表的 id 计算一个表中的行数

来自分类Dev

选择表中ID等于另一个表中另一个ID的行

来自分类Dev

选择表中ID等于另一个表中另一个ID的行

来自分类Dev

将字段的值限制为休眠中另一个表中的条目

来自分类Dev

Postgres从另一个表中填充JSON内部的ID

来自分类Dev

基于另一个表中的ID或主键列表的PostGres SQL更新值

来自分类Dev

SQL Server:从另一个表(ASP.net)中获取行中每个ID的名称

来自分类Dev

是否可以从Postgres中的另一个表空间继承表?

来自分类Dev

如何将标准限制为另一个表中的 fk?

来自分类Dev

如何根据 SQL Server 中的另一个表列值限制插入到表?

来自分类Dev

限制SQL查询中每个ID的行数

来自分类Dev

从不同表中选择数据限制为10,而另一个表中限制为5

来自分类Dev

使用where条件将表中的数据插入MySQL中的另一个表

来自分类Dev

MySQL:对于每个用户,在具有该用户ID的另一个表中添加一行

来自分类Dev

Postgres-jsonb:更新列中的键,并使用另一个表中的值

来自分类Dev

根据另一个表中的行数将特定行更新为值

来自分类Dev

SQL 根据另一个表中的行数隐藏/显示行

来自分类Dev

SQL - 根据另一个表中的行数删除行

来自分类Dev

如何为另一个表的每个ID向一个表中插入多行

来自分类Dev

从另一个更新表中的ID

来自分类Dev

计算另一个表中的行

来自分类Dev

触发从另一个表中删除行

来自分类Dev

选择不在另一个表中的行

来自分类Dev

两个表中的Postgres类似选择查询在一个表中花费的时间比在另一个表中要长得多

来自分类Dev

如何在SQL Server 2012中为另一个表中的每个父主键选择一个表的给定行数?

来自分类Dev

Where子句检查另一个表中的两列

来自分类Dev

SQL WHERE NOT IN 查询返回另一个表中的值

Related 相关文章

  1. 1

    在Postgres中删除另一个引用的表

  2. 2

    使用NOT IN的另一个表中的WHERE子句

  3. 3

    根据另一个表的 id 计算一个表中的行数

  4. 4

    选择表中ID等于另一个表中另一个ID的行

  5. 5

    选择表中ID等于另一个表中另一个ID的行

  6. 6

    将字段的值限制为休眠中另一个表中的条目

  7. 7

    Postgres从另一个表中填充JSON内部的ID

  8. 8

    基于另一个表中的ID或主键列表的PostGres SQL更新值

  9. 9

    SQL Server:从另一个表(ASP.net)中获取行中每个ID的名称

  10. 10

    是否可以从Postgres中的另一个表空间继承表?

  11. 11

    如何将标准限制为另一个表中的 fk?

  12. 12

    如何根据 SQL Server 中的另一个表列值限制插入到表?

  13. 13

    限制SQL查询中每个ID的行数

  14. 14

    从不同表中选择数据限制为10,而另一个表中限制为5

  15. 15

    使用where条件将表中的数据插入MySQL中的另一个表

  16. 16

    MySQL:对于每个用户,在具有该用户ID的另一个表中添加一行

  17. 17

    Postgres-jsonb:更新列中的键,并使用另一个表中的值

  18. 18

    根据另一个表中的行数将特定行更新为值

  19. 19

    SQL 根据另一个表中的行数隐藏/显示行

  20. 20

    SQL - 根据另一个表中的行数删除行

  21. 21

    如何为另一个表的每个ID向一个表中插入多行

  22. 22

    从另一个更新表中的ID

  23. 23

    计算另一个表中的行

  24. 24

    触发从另一个表中删除行

  25. 25

    选择不在另一个表中的行

  26. 26

    两个表中的Postgres类似选择查询在一个表中花费的时间比在另一个表中要长得多

  27. 27

    如何在SQL Server 2012中为另一个表中的每个父主键选择一个表的给定行数?

  28. 28

    Where子句检查另一个表中的两列

  29. 29

    SQL WHERE NOT IN 查询返回另一个表中的值

热门标签

归档