2017-10-12 38 views
1

例如1个随机记录我有2个表供应商和vendorCategory。然后我想要获得6个不同类别的随机供应商。它应该如何转换为postgresql?或者更好的QueryDSL for java。SQL,让每类

比如我有厂商:V1,V2,V3,等等... 然后,我有三类:C1,C2,C3等... 在我们的例子,让我们说,VX有一类CX。因此V1具有C1类别,V2具有C2等等...

查询的结果应该返回V1,V2,V3,V4,V5,V6。或以任何随机顺序。它不应该返回具有相同类别的供应商。例如,假设我们有v1a,它有一个类别c1。所以v1和v1a不应该一起返回。

+1

编辑你的问题,并提供样本数据和预期的结果。 “不同”类别是什么意思? –

+0

更新了问题。谢谢。 – czetsuya

回答

2

多亏了2个回答上面我能想出:

select * from 
(
SELECT DISTINCT ON(vc.id) v.vendor_name, vc.description, vc.id 
FROM cat_vendor_category AS vc 
INNER JOIN cat_vendor AS v ON v.vendor_category_id = vc.id 
ORDER BY vc.id, random() 
    ) Q 
    order by random() 
LIMIT 6; 

这产生具有独特的类厂商的随机列表。现在

真正的问题是如何将其转化为QueryDSL或至少JPQL。

1

这样的事情。名称取决于您的具体配置:

SELECT DISTINCT ON(vc.id), v.vendorName, vc.categoryName 
FROM vendorCategory AS vc 
INNER JOIN vendors AS v ON v.categoryId = vc.id 
ORDER BY random() 
LIMIT 6; 

因此,不同的类别,随机行,只有六个

如果你想获得一个正确的答案,请提供样品表。我刚才给你的想法是我看到的,而不是完整的解决方案。 (因为没有真实数据)

+1

抛出一个错误:“SELECT DISTINCT ON表达式必须BY表达式初始顺序一致”。 – czetsuya

1

您可以使用DISTINCT ON()这样的(特别到PostgreSQL):

SELECT DISTINCT ON (vc.categoryName) v.vendorName, vc.categoryName 
FROM vendorCategory vc 
INNER JOIN vendors v ON v.categoryId = vc.id 
LIMIT 6 
+0

这实际上是我们想出了。但问题是它总是检索某个类别的第一行。比如我有一个供应商的V1,V2,V3 C1类。然后无论我运行这个查询多少次,它总是返回v1。 – czetsuya