【问题标题】:How I can make SELECT using DISTINCT and ORDER BY RANDOM at same time?如何同时使用 DISTINCT 和 ORDER BY RANDOM 进行 SELECT?
【发布时间】:2012-03-21 06:25:56
【问题描述】:

场景:

我在视图中有一个模型,我正在使用 django-filters,所以我需要创建一个由 django-filters 过滤并随机排序的查询集。

问题: django-filters 将 DISTINCT 添加到 SQL 中,类似于:

SELECT DISTINCT ... WHERE ("products_creditcard"."is_active" = True  AND    ("products_creditcard"."bank_id" = 3  OR "products_creditcard"."bank_id" = 1  OR "products_creditcard"."bank_id" = 4 )) ORDER BY RANDOM()

但这会为 postgresql 生成异常:

错误:对于 SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表中 SQL状态:42P10 人物:1992

我认为可能存在将随机添加到选择中的任何方式,有什么想法吗?

【问题讨论】:

    标签: django postgresql random django-orm django-filter


    【解决方案1】:

    你只需要使用 group by 而不是 DISTINCT

    SELECT  ... WHERE ("products_creditcard"."is_active" = True  AND    ("products_creditcard"."bank_id" = 3  OR "products_creditcard"."bank_id" = 1  OR "products_creditcard"."bank_id" = 4 )) ORDER BY RANDOM() GROUP BY fieldName
    

    希望这对你有用

    【讨论】:

    • 坏事是我需要 hack django*filters
    【解决方案2】:

    可以使用嵌套 SQL 吗?

    这可能不是最好的方法,但也许这样的方法会在紧要关头起作用:

    SELECT 
       * 
    FROM 
       (SELECT DISTINCT ... 
        WHERE 
           ("products_creditcard"."is_active" = True 
              AND("products_creditcard"."bank_id" = 3  
              OR "products_creditcard"."bank_id" = 1  
              OR "products_creditcard"."bank_id" = 4)
       ) AS Source
    ORDER BY RANDOM()
    

    编辑:查看此页面上的另一种解决方案(关于使用“group by”代替 distinct 的解决方案),我相信这个解决方案比我的要优雅得多。

    【讨论】:

      【解决方案3】:

      使用GROUP BY,正如@Shivam 所写。但他的语法无效。
      GROUP BY 必须在ORDER BY 之前。像这样:

      SELECT p.column1, p.column2, ..
      FROM   products_creditcard p
      WHERE  p.is_active
      AND    p.bank_id IN (1, 3, 4)
      GROUP  BY p.column1, p.column2, ..
      ORDER  BY random();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多