小编典典

如何在PostgreSQL中将SELECT DISTINCT与RANDOM()函数一起使用?

sql

我正在尝试运行SQL查询以获取四个随机项。由于表中product_filter有多个toupleproduct我必须使用DISTINCTin SELECT,所以出现此错误:

对于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();

阅读 171

收藏
2021-05-05

共1个答案

小编典典

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

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半联接可能是最快,最简单的解决方案。使用它不会在基表中相乘product,因此您无需使用再次删除它们DISTINCT。

*LIMIT必须排在最后ORDER BY。

*我将WHERE简化 p.visible = ‘t’为p.visible,因为这应该是一个布尔列。

2021-05-05