SQL为每个类别获取1条随机记录

SQL为每个类别获取1条随机记录,sql,postgresql,hibernate,querydsl,Sql,Postgresql,Hibernate,Querydsl,例如,我有两个表供应商和供应商类别。然后我想得到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不应该同时返回。类似这

例如,我有两个表供应商和供应商类别。然后我想得到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不应该同时返回。

类似这样的内容。名称取决于您的特定配置:

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;
所以,不同的类别,随机的行,只有六个


如果您想得到正确答案,请提供示例表。我只是告诉你我是怎么看的,而不是完整的解决方案。因为没有像这样的真实数据。名称取决于您的特定配置:

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;
所以,不同的类别,随机的行,只有六个


如果您想得到正确答案,请提供示例表。我只是告诉你我是怎么看的,而不是完整的解决方案。因为没有真实数据

您可以使用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 

您可以对PostgreSQL使用DISTINCT ON,如下所示:

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

多亏了上面的两个答案,我才得出:

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。

多亏了上面的两个答案,我才能够想出:

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。

编辑您的问题并提供示例数据和所需结果。不同类别是什么意思?更新了问题。谢谢。编辑您的问题并提供示例数据和所需结果。不同类别是什么意思?更新了问题。谢谢。这就是我们想到的。但问题是它总是检索某个类别的第一行。例如,我有类别c1和供应商v1、v2、v3。然后不管我运行这个查询多少次,它总是返回v1。这实际上就是我们得出的结果。但问题是它总是检索某个类别的第一行。例如,我有类别c1和供应商v1、v2、v3。然后,无论我运行此查询多少次,它始终返回v1。抛出错误:表达式上的SELECT DISTINCT必须按表达式匹配初始顺序。抛出错误:表达式上的SELECT DISTINCT必须按表达式匹配初始顺序。