加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在PostgreSQL中使用SELECT DISTINCT和RANDOM()函数?

发布时间:2020-12-13 15:57:28 所属栏目:百科 来源:网络整理
导读:我正在尝试运行SQL查询以获取四个随机项.由于表product_filter在产品中有多个touple,我必须在SELECT中使用DISTINCT,所以我得到这个错误: 对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中 但是如果我把RANDOM()放在我的SELECT中,它将避免DISTINCT结
我正在尝试运行SQL查询以获取四个随机项.由于表product_filter在产品中有多个touple,我必须在SELECT中使用DISTINCT,所以我得到这个错误:

对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中

但是如果我把RANDOM()放在我的SELECT中,它将避免DISTINCT结果.

有人知道如何使用DISTINCT与RANDOM()函数?以下是我有问题的查询.

SELECT DISTINCT
    p.id,p.title
FROM
    product_filter pf
    JOIN product p ON pf.cod_product = p.cod
    JOIN filters f ON pf.cod_filter = f.cod
WHERE
    p.visible = TRUE
LIMIT 4
ORDER BY RANDOM();

解决方法

您可以简化查询以避免先验问题:

SELECT p.cod,p.title
FROM   product p
WHERE  p.visible
AND    EXISTS (
    SELECT 1
    FROM   product_filter pf
    JOIN   filters f ON f.cod = pf.cod_filter
    WHERE  pf.cod_product = p.cod
    )
ORDER  BY random()
LIMIT  4;

主要观点:

>结果中只有表product的列,其他表仅检查是否存在匹配的行.对于这样的情况,EXISTS semi-join可能是最快和最简单的解决方案.使用它不会将基表产品中的行相乘,因此您无需使用DISTINCT再次删除它们.ORDER BY之后,LIMIT必须持续到最后.>我将p.visible =’t’简化为p.visible,因为这应该是一个布尔列.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读