我正在尝试运行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,因为这应该是一个布尔列.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。