SQL每个类别获得1个随机记录

时间:2017-10-12 14:17:27

标签: sql postgresql hibernate querydsl

例如,我有2个表供应商和vendorCategory。然后我想得到6个不同类别的随机供应商。应该如何翻译成postgresql?或者更好的QueryDSL for java。

示例我有供应商:v1,v2,v3等等...... 然后我有类别:c1,c2,c3等...... 在我们的例子中,让我们说vx有一个类别cx。因此v1具有类别c1,v2具有c2,依此类推......

查询结果应返回v1,v2,v3,v4,v5,v6。或者以任何随机顺序。它不应该返回具有相同类别的供应商。例如,让我们说我们有v1a,它有一个类别c1。所以v1和v1a不应该一起返回。

3 个答案:

答案 0 :(得分: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 :(得分: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;

所以,不同的类别,随机行和只有六个

如果您想获得正确答案,请提供样本表。我刚刚告诉你我是如何看待它的,而不是完整的解决方案。 (因为没有真实的数据)

答案 2 :(得分: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