我试图运行一个SQL查询来获取四个随机项。由于表product_filter
在product
中有多个元组,我必须在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();
5条答案
按热度按时间nzkunb0c1#
你要么做一个子查询
或者你尝试对这些相同的字段进行分组:
这两个表达式中哪一个的计算速度更快取决于表结构和索引;在cod和title上建立适当的索引,子查询版本将运行得更快(cod和title将从索引基数信息中获取,并且cod是JOIN所需的唯一键,因此如果您按title,cod和visible(在WHERE中使用)进行索引,则很可能根本不会访问物理表。
我不确定第二种表达方式是否也会发生这种情况。
uidvcgyl2#
简化查询以避免先验问题:
结果中只有表
product
中的列,其他表只检查是否存在匹配行。对于这种情况,EXISTS
表达式可能是最快和最简单的。它不会将基表product
中的行相乘,因此您不需要再次使用DISTINCT
删除它们。LIMIT
必须最后出现,在ORDER BY
之后。我将
WHERE p.visible = 't'
简化为WHERE p.visible
,同样的事情,只是boolean
列更简单。bkhjykvo3#
使用子查询。不要忘记表别名
t
。LIMIT
在ORDER BY
之后。zpf6vheq4#
我想你需要一个子查询:
首先计算不同的值,然后计算极限。
请注意,这确实会影响性能,因为在选择所需内容之前,此查询会对所有内容执行不同的操作。这是否重要取决于表的大小以及如何使用查询。
ccrfmcuu5#
这首先是随机的,然后是极限。