SQL 每个类别获得 1 条随机记录
SQL to get 1 random record per category
例如,我有 2 个表 vendor 和 vendorCategory。然后我想获得 6 个不同类别的随机供应商。它应该如何翻译成postgresql?或者更好的 QueryDSL java.
示例我有供应商:v1、v2、v3 等等...
然后我有类别:c1、c2、c3 等等...
在我们的例子中,假设 vx 有一个类别 cx。所以 v1 有类别 c1,v2 有 c2 等等...
查询结果应该returnv1,v2,v3,v4,v5,v6。或者以任何随机顺序。它不应该 return 具有相同类别的供应商。例如,假设我们有 v1a,它有一个类别 c1。所以 v1 和 v1a 不应该 return 放在一起。
像这样。名称取决于您的具体配置:
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
感谢上面的 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。
例如,我有 2 个表 vendor 和 vendorCategory。然后我想获得 6 个不同类别的随机供应商。它应该如何翻译成postgresql?或者更好的 QueryDSL java.
示例我有供应商:v1、v2、v3 等等... 然后我有类别:c1、c2、c3 等等... 在我们的例子中,假设 vx 有一个类别 cx。所以 v1 有类别 c1,v2 有 c2 等等...
查询结果应该returnv1,v2,v3,v4,v5,v6。或者以任何随机顺序。它不应该 return 具有相同类别的供应商。例如,假设我们有 v1a,它有一个类别 c1。所以 v1 和 v1a 不应该 return 放在一起。
像这样。名称取决于您的具体配置:
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
感谢上面的 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。