首页 > 解决方案 > 为 sqlalchemy/postgresql 中的数据库查询列表获取数组中唯一数字的频率

问题描述

我很难找到解决上述问题的方法。这是详细信息。

假设我们有一个包含不同产品的表 X,每个产品都有一个唯一的整数 id 和一个唯一的代码。我们还有 Table Y,其中包含 Table X 中每个产品的不同变体,它们在产品名称、长度、宽度等方面略有不同。因此在Table XTable Y之间定义了一对多的关系。

前端显示所有这些产品变体,并允许从列表中选择它们并将所有选择的产品详细信息导出为 pdf。然而,选择它们有一种奇怪的方式,如果用户点击一个产品,那么如果它们在同一个列表中,那么所有具有相同唯一代码的产品变体都会被选中。 That is, basically whenever a product variant is selected, the full product gets selected along with all its variants in the list. 但是,如果用户愿意,他们可以根据需要单独取消选择每个产品变体。

表 Z包含导出的所有产品变体 ID 的日志。因此它看起来像这样

编号 | 导出_at | 导出方式 | product_variant_ids

1 | 一些日期时间 | 一些用户 | {1, 2, 3, 4}
2 | 一些日期时间 | 一些用户 | {3, 4}
3 | 一些日期时间 | 一些用户 | {6, 8, 9}
4 | 一些日期时间 | 一些用户 | {1, 6, 7}
5 | 一些日期时间 | 一些用户 | {3, 5, 7}

等等..

在这里您将观察到:
1. 在每一行上,一个产品变体 ID 在数组中只能出现一次
2. 但是,一个产品变体 ID 可以出现在不同的行

对于所有行中存在的每个唯一产品变体 ID,我想计算它们在每行中出现的频率的总和。

例如,在上面的虚拟表中,产品变体 id 1在整个表中恰好出现两次,分别在第 1 行和第 4 行。类似地,产品变体 id 3出现在第 1、2 和 5 行。

我试图天真地计算它,比如

朴素的算法:

从表中存在的所有唯一 ID 的集合中,
为每一行检查该集合中的每个唯一 ID 是否存在于每一行中
,并在每次出现时增加计数器。

我不知道如何为其编写子查询,因此,我无法在 postgres 控制台上尝试任何查询。

当使用像 SQLAlchemy 这样的 ORM 时,它会导致只有 15-20 条日志后的操作非常慢。

谁能引导我朝着正确的方向前进,什么可能是更有效的解决方案?

标签: postgresqlsqlalchemy

解决方案


推荐阅读