首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从返回随机行的select中获取剩余数据

如何从返回随机行的select中获取剩余数据
EN

Stack Overflow用户
提问于 2016-10-19 15:39:36
回答 3查看 80关注 0票数 2

如果我从总共50部电影中随机选择20部电影,

代码语言:javascript
运行
复制
SELECT movieName
FROM movies 
ORDER BY random() 
LIMIT 20

那么我如何继续从剩下的30部电影中随机选择10部呢?

如果我继续使用上面的代码,就会出现重复键值错误。

EN

回答 3

Stack Overflow用户

发布于 2016-10-19 16:01:41

生成随机密钥key,然后按md5(movieName || key)排序。跟踪这个键,这样您就可以使用具有相同键的OFFSET请求下一组元组。使用相同的键两次将导致相同的顺序。使用不同的键将导致不同的顺序。这看起来是随机的,因为像md5这样的哈希函数对于相似的输入返回完全不同的结果。

票数 4
EN

Stack Overflow用户

发布于 2016-10-19 16:01:04

您需要存储已在某个位置显示的电影的名称。然后,当您重新运行该语句时,向查询中添加一个where moviename not in (....),以排除已经显示的那些内容。

如果您可以在请求之间保持与数据库的连接打开,则可以使用临时表来存储已经显示的电影:

代码语言:javascript
运行
复制
create temporary table displayed_movies(moviename text);

然后,您可以使用以下语句显示电影:

代码语言:javascript
运行
复制
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 (...)条件。

票数 2
EN

Stack Overflow用户

发布于 2016-10-19 15:51:58

您可以在如下所示的新查询中使用您的查询:

代码语言:javascript
运行
复制
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(您的查询)将返回比第一次执行时更多的随机电影。

希望你能帮助我!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40125052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档