2016-10-19 32 views
2

剩余的数据。如果我选​​择50部电影20部电影随机总量,如何从一个选择返回随机行

SELECT movieName 
FROM movies 
ORDER BY random() 
LIMIT 20 

那我怎么继续选择10从剩下的30部电影随机的?

如果我继续使用上面的代码,则存在重复的键值错误。

+2

改为使用游标。 – jarlh

回答

0

您可以使用您的查询在这样一个新的查询:

SELECT  
    movieName 
FROM  
    movies 
WHERE 
    movieName not in (SELECT film_id FROM film ORDER BY random() LIMIT 20) 
ORDER BY  
    random() 
LIMIT 10; 

你不会看到你的第一个查询选定的20部电影。在这种情况下,Theres仅仅是选择20部电影的结果,而不是选择剩下的30部分中的10部。

请记住,如果您是先使用您的语句,然后再查询,则子查询(您的查询)将返回比第一次执行时更多的随机电影。

希望得到!

+3

这不会起作用,因为该查询的第二次执行将在子选择中返回不同的电影列表 –

2

您需要存储已显示在某处的电影的名称。然后,当您重新运行该语句时,请在查询中添加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 (...)

4

生成随机密钥key,然后按md5(movieName || key)进行订购。跟踪此密钥,以便您可以使用OFFSET使用相同的密钥请求下一组元组。使用相同的密钥两次将导致相同的顺序。使用不同的密钥将导致不同的顺序。这看起来是随机的,因为像md5这样的散列函数对类似的输入返回完全不同的结果。

相关问题