Sql 随机拾取具有不同名称的X个对象

Sql 随机拾取具有不同名称的X个对象,sql,django,postgresql,Sql,Django,Postgresql,以下尝试: Article.objects.filter(category__id="b5e20323-8cec-413a-b405-342b3809f9a4").distinct('title').order_by("?") 给我: 编程错误:表达式上的SELECT DISTINCT必须按表达式匹配初始顺序 我尝试使用原始SQL。所以我试着: SELECT * FROM (SELECT DISTINCT title from article WHERE

以下尝试:

Article.objects.filter(category__id="b5e20323-8cec-413a-b405-342b3809f9a4").distinct('title').order_by("?")
给我:

编程错误:表达式上的SELECT DISTINCT必须按表达式匹配初始顺序

我尝试使用原始SQL。所以我试着:

SELECT * FROM (SELECT DISTINCT title from article WHERE category_id = '...') AS inner_distinct ORDER BY RANDOM() LIMIT 3
这是可行的,但我需要在标题中添加一个附加字段。如果我将原始查询更改为:

SELECT * FROM (SELECT DISTINCT title, id from article WHERE category_id = '...') AS inner_distinct ORDER BY RANDOM() LIMIT 3
突然之间,DISTINCT关键字没有效果

我怎样才能克服这个问题

<>编辑:考虑我有一张名为“形状”的表格。以下是示例数据:

ID                                      name
====================================    ========
2f3e9b34-0184-4e92-b205-88dac05b7cb0    Oval
b6382663-848a-4760-ad2a-3195977cf892    Line
e77a6a1a-7e99-4b00-97d3-df684e1bcc38    Line
ef7eb727-b4a8-43aa-b11f-1ddc5c0385fe    Triangle
提供的解决方案SELECT*FROM SELECT DISTINCT ON name,id FROM shapes AS INTERNAL_DISTINCT ORDER BY RANDOM LIMIT 3始终以随机顺序返回以下内容

ID                                      name
====================================    ========
2f3e9b34-0184-4e92-b205-88dac05b7cb0    Oval
b6382663-848a-4760-ad2a-3195977cf892    Line
ef7eb727-b4a8-43aa-b11f-1ddc5c0385fe    Triangle
而且永远不会:

e77a6a1a-7e99-4b00-97d3-df684e1bcc38    Line
而不是:

b6382663-848a-4760-ad2a-3195977cf892    Line
虽然一次只能选一个,但两个都应该在某些时候被选中

在Postgres上使用这个独特的功能

SELECT * FROM (SELECT DISTINCT ON (title) title, id from article WHERE category_id = '...') AS inner_distinct ORDER BY RANDOM() LIMIT 3
编辑:-使用OP中的最新样本数据更新查询

我把不同的放在外面,把随机排列的顺序放在里面,按照预期工作。请查收

select distinct on (name) name,id 
  from (select name, id from shapes order by random()) as inner_distinct 
order by name limit 3
**不同的选择**

使用row_编号,我们可以实现您想要的。我已经测试了形状,但你可以根据需要替换为文章

select name,id 
  from (select name, id,row_number() over (partition by name order by random()) rn 
          from shapes) i 
where i.rn = 1
order by random()
limit 3
使用这个与Postgres不同的功能

SELECT * FROM (SELECT DISTINCT ON (title) title, id from article WHERE category_id = '...') AS inner_distinct ORDER BY RANDOM() LIMIT 3
编辑:-使用OP中的最新样本数据更新查询

我把不同的放在外面,把随机排列的顺序放在里面,按照预期工作。请查收

select distinct on (name) name,id 
  from (select name, id from shapes order by random()) as inner_distinct 
order by name limit 3
**不同的选择**

使用row_编号,我们可以实现您想要的。我已经测试了形状,但你可以根据需要替换为文章

select name,id 
  from (select name, id,row_number() over (partition by name order by random()) rn 
          from shapes) i 
where i.rn = 1
order by random()
limit 3
原始答案

在这种情况下,当你说selectdistinct title,id时,你告诉它同时使用'title'和'id'来选择distinct。因此,请在下面使用distinct:

SELECT * FROM (SELECT DISTINCT ON (title) title, id from article WHERE category_id = '...') AS inner_distinct ORDER BY RANDOM() LIMIT 3
编辑以提供不同列的随机性

原始答案

在这种情况下,当你说selectdistinct title,id时,你告诉它同时使用'title'和'id'来选择distinct。因此,请在下面使用distinct:

SELECT * FROM (SELECT DISTINCT ON (title) title, id from article WHERE category_id = '...') AS inner_distinct ORDER BY RANDOM() LIMIT 3
编辑以提供不同列的随机性


我会要求添加样本数据和预期结果。我会要求添加样本数据和预期结果。问题是,当我有多篇文章标题相同时,它总是返回其中一篇。不是随机挑选的。@Adam Silver,我会要求提供一些样本数据,这将有助于更好地研究这个问题。谢谢-通过分区。。。对我来说,与DISTINCT ON相比,worked Alternative不起作用——总是同一行。问题是,当我有多篇文章标题相同时,它总是返回其中的一行。不是随机挑选的。@Adam Silver,我会要求提供一些样本数据,这将有助于更好地研究这个问题。谢谢-通过分区。。。对我来说,与DISTINCT ON相比,worked Alternative不起作用——总是同一行。问题是,当我有多篇文章标题相同时,它总是返回其中的一行。不是随便挑选的。这几乎是我需要的。唯一的问题是这些行不是随机排列的。如果我的数据库中有4个标题,其中2个带有相同的标题,其中一个重复的标题被排除在我想要的之外,但标题总是以相同的顺序出现。第三个编辑解决方案感觉相当粗糙,我肯定有更好的方法可以做到这一点,但它确实完成了任务。问题是,当我有多篇文章标题相同时,它总是返回其中一篇。不是随便挑选的。这几乎是我需要的。唯一的问题是这些行不是随机排列的。如果我的数据库中有4个标题,其中2个带有相同的标题,其中一个重复的标题被排除在我想要的之外,但标题总是以相同的顺序出现。第三个编辑解决方案感觉非常粗糙,我肯定有更好的方法可以做到,但它确实完成了工作。