剩余的数据。如果我选择50部电影20部电影随机总量,如何从一个选择返回随机行
SELECT movieName
FROM movies
ORDER BY random()
LIMIT 20
那我怎么继续选择10从剩下的30部电影随机的?
如果我继续使用上面的代码,则存在重复的键值错误。
剩余的数据。如果我选择50部电影20部电影随机总量,如何从一个选择返回随机行
SELECT movieName
FROM movies
ORDER BY random()
LIMIT 20
那我怎么继续选择10从剩下的30部电影随机的?
如果我继续使用上面的代码,则存在重复的键值错误。
您可以使用您的查询在这样一个新的查询:
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部。
请记住,如果您是先使用您的语句,然后再查询,则子查询(您的查询)将返回比第一次执行时更多的随机电影。
希望得到!
这不会起作用,因为该查询的第二次执行将在子选择中返回不同的电影列表 –
您需要存储已显示在某处的电影的名称。然后,当您重新运行该语句时,请在查询中添加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 (...)
。
生成随机密钥key
,然后按md5(movieName || key)
进行订购。跟踪此密钥,以便您可以使用OFFSET
使用相同的密钥请求下一组元组。使用相同的密钥两次将导致相同的顺序。使用不同的密钥将导致不同的顺序。这看起来是随机的,因为像md5
这样的散列函数对类似的输入返回完全不同的结果。
改为使用游标。 – jarlh