如果我从总共50部电影中随机选择20部电影,
SELECT movieName
FROM movies
ORDER BY random()
LIMIT 20
那么我如何继续从剩下的30部电影中随机选择10部呢?
如果我继续使用上面的代码,就会出现重复键值错误。
发布于 2016-10-19 16:01:41
生成随机密钥key
,然后按md5(movieName || key)
排序。跟踪这个键,这样您就可以使用具有相同键的OFFSET
请求下一组元组。使用相同的键两次将导致相同的顺序。使用不同的键将导致不同的顺序。这看起来是随机的,因为像md5
这样的哈希函数对于相似的输入返回完全不同的结果。
发布于 2016-10-19 16:01:04
您需要存储已在某个位置显示的电影的名称。然后,当您重新运行该语句时,向查询中添加一个where moviename not in (....)
,以排除已经显示的那些内容。
如果您可以在请求之间保持与数据库的连接打开,则可以使用临时表来存储已经显示的电影:
create temporary table displayed_movies(moviename text);
然后,您可以使用以下语句显示电影:
with selected as (
select moviename
from movies
where moviename not in (select d.moviename
from displayed_movies d)
order by random()
limit 20
), inserted as (
insert into displayed_movies (moviename)
select moviename
from selected
)
select *
from selected;
每次运行上述语句时,它都会选择一组不同的(随机)电影。如果显示了所有电影,则不会返回任何内容。
再说一次:只有在每次调用之间保持数据库连接打开的情况下,这才能起作用。
如果不能保持连接打开(这意味着不能使用临时表),则需要记住应用程序中的这些名称并生成适当的where moviename not in (...)
条件。
发布于 2016-10-19 15:51:58
您可以在如下所示的新查询中使用您的查询:
SELECT
movieName
FROM
movies
WHERE
movieName not in (SELECT film_id FROM film ORDER BY random() LIMIT 20)
ORDER BY
random()
LIMIT 10;
您不会看到第一次查询时选择的20部电影。在这种情况下,只有选择20部电影的结果,然后选择剩余30部电影中的10部。
请记住,如果您首先使用语句,然后执行此查询,则subselect(您的查询)将返回比第一次执行时更多的随机电影。
希望你能帮助我!
https://stackoverflow.com/questions/40125052
复制相似问题