好了,所以我在这里有一个学习的时刻,并找出后_一个_办法得到这个工作,我很好奇,如果任何人有更多的位Postgres的经验能帮助我想出一个办法做到这一点而不做整个幕后花絮(或对我要获取的每个商品进行一次查询)…现在进行解释:
假设我有1000条记录,我们将在具有以下字段的数据库中将它们称为“实例”:
id
user_id
other_id
我想创建一个可以调用的方法,该方法提取10个实例,每个实例都有一个唯一的other_id字段,用简单的英语显示(我知道这是行不通的:)):
Select * from instances where user_id = 3 and other_id is unique limit 10
因此,我希望能够在这10个实例上运行map函数并返回类似[1,2, 3,4,5,6,7,8,9,10]。
从理论上讲,尽管我正在努力避免它们,但我目前可能可以做两件事之一:
引入大量的说例,即50个实例,然后在红宝石土地上对它们进行排序,以找到10个唯一的实例。这将不允许我利用数据库中已经进行的任何优化,而且冒着查询50个没有10个唯一的other_id的项目的风险,除非我坚持使用,否则我将被困在其中。做了另一个查询。
无论如何,希望有人能够告诉我我忽略了一个简单的选择:)我知道这是在真正需要之前进行的 一种
优化,但是此功能将一遍又一遍地运行,所以我认为这不是一个简单的选择。现在浪费时间。
作为记录,我使用的是Ruby 1.9.3,Rails 3.2.13和Postgresql(Heroku)
谢谢!
编辑 :只是想举一个技术上可行的功能的示例(上面是第1个)
def getInstances(limit, user)
out_of_instances = false
available = []
other_ids = [-1] # added -1 to avoid submitting a NULL query
until other_ids.length == limit || out_of_instances == true
instance = Instance.where("user_id IS ? AND other_id <> ALL (ARRAY[?])", user.id, other_ids).limit(1)
if instance != []
available << instance.first
other_ids << instance.first.other_id
else
out_of_instances = true
end
end
end
然后您将运行:
getInstances(10, current_user)
尽管这可行,但这并不理想,因为每次调用它时都会导致10个单独的查询:(
在单个SQL查询中,这可以轻松实现,SELECT DISTINCT ON...
这是PostgreSQL特定的功能。
参见http://www.postgresql.org/docs/current/static/sql-
select.html
SELECT DISTINCT ON(expression [,…])仅保留给定表达式等于的每组行的第一行。使用与ORDER
BY相同的规则来解释DISTINCT ON表达式(请参见上文)。请注意,除非使用ORDER
BY来确保所需的行首先出现,否则每个集合的“第一行”都是不可预测的
以您的示例为例:
SELECT DISTINCT ON (other_id) *
FROM instances
WHERE user_id = 3
ORDER BY other_id LIMIT 10
我保留了一份按“顺序”排列的产品清单。当我试着从房间里拿一份产品清单的时候。我得到以下错误。但我做了一个TypeConvertor。会有什么错误呢? 订单 产品 命令道 转换器 错误 java:53:错误:查询返回的列在com.vepe.navigation.model.entity.product中没有字段[id,orderId,name,pathImage,price,priceDiscoun
问题内容: 我有这张桌子: 我想创建一个仅在时才适用于字段的唯一约束。 我试图创建一个,但是Oracle说: 什么是正确的语法? 问题答案: @jamesfrj:您似乎正在尝试确保您的表应只包含一个记录。 您可以尝试通过串联各列来创建唯一的功能索引,如下所示 希望能帮助到你
问题内容: 我有一个带有列“ position”的表“ items”。位置具有唯一且非空的约束。为了在位置x插入新行,我首先尝试增加后续项的位置: 这导致了唯一的约束冲突: 问题似乎出在PostgreSQL执行更新的顺序上。PostgreSQL <9.0中的唯一约束是不可延迟的,不幸的是,当前无法使用9.0。另外,UPDATE语句不支持ORDER BY子句,并且以下命令也不起作用(仍然重复键冲突)
问题内容: 我想从MySQL查询返回第二条,第三条或第四条记录(基于ID递增的查询) 问题是,我不知道ID,只是它是查询中的第三行。 问题答案: 它说从记录n开始返回一个记录。
问题内容: 我在Elasticsearch中有一个小型数据库,出于测试目的,我想拉回所有记录。我正在尝试使用以下形式的网址… 有人可以给我您用来完成此操作的URL吗? 问题答案: 我认为支持lucene语法是这样的: 大小默认为10,因此您可能还需要获取10个以上的商品。(其中BIGNUMBER等于您认为大于数据集的数字) 但是,elasticsearch文档建议使用扫描搜索类型针对大型结果集。
我正在努力学习GraphQL( 我只得到一级字段,比如: 以下是我的模式: 我的解析器: 知道我做错了什么吗?