【问题标题】:SQL to get 1 random record per categorySQL 为每个类别获取 1 个随机记录
【发布时间】:2017-10-12 14:17:27
【问题描述】:

例如,我有 2 个表 vendor 和 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 不应该一起返回。

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需结果。 “不同”类别是什么意思?
  • 更新了问题。谢谢。

标签: sql postgresql hibernate querydsl


【解决方案1】:

感谢上面的 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】:

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

    【讨论】:

    • 这实际上是我们想出的。但问题是它总是检索某个类别的第一行。例如,我有供应商 v1、v2、v3 的类别 c1。然后无论我运行这个查询多少次,它总是返回 v1。
    【解决方案3】:

    类似的东西。名称取决于您的具体配置:

    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 表达式必须匹配初始 ORDER BY 表达式”。
    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2012-12-24
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多