Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在针对随机记录的MySQL查询中,排除具有特定ID的记录的最有效方法是什么?_Php_Mysql_Random_Notin - Fatal编程技术网

Php 在针对随机记录的MySQL查询中,排除具有特定ID的记录的最有效方法是什么?

Php 在针对随机记录的MySQL查询中,排除具有特定ID的记录的最有效方法是什么?,php,mysql,random,notin,Php,Mysql,Random,Notin,我有一个api端点,它从一个名为“posts”的表中返回X个数量的随机帖子。此端点由移动应用程序使用。它通过在posts表上执行SELECT COUNT(*)并返回表中的POST数量来检索随机POST。然后它进入一个for循环,在该循环中,在每个循环的开始处,生成一个从0到计数(*)的随机数。然后使用方便的偏移量获得一个随机柱。这个for循环一直持续到获得X个随机帖子的数量 伪代码: FUNCTION getRandPosts : $numOfPosts = queryExecute("SEL

我有一个api端点,它从一个名为“posts”的表中返回X个数量的随机帖子。此端点由移动应用程序使用。它通过在posts表上执行SELECT COUNT(*)并返回表中的POST数量来检索随机POST。然后它进入一个for循环,在该循环中,在每个循环的开始处,生成一个从0到计数(*)的随机数。然后使用方便的偏移量获得一个随机柱。这个for循环一直持续到获得X个随机帖子的数量

伪代码:

FUNCTION getRandPosts :

$numOfPosts = queryExecute("SELECT COUNT(*) from posts");

for (iterations < numOfRandomPostsNeeded) {
    $randomNumber = rand(0, $numOfPosts)

    $randomPost = queryExecute("SELECT * from posts LIMIT 1, OFFSET $randomNumber")


}
  • 检索每个随机帖子后,将该帖子id保存到一个名为“seenPosts”的表中,其中还有一个名为idOfApp的列,用于区分用户

    FUNCTION getRandPosts(STRING appInstallID) :
    ...
    for ...
    
    
    $randomPost = queryExecute("
        SELECT posts.* FROM posts
        JOIN seenPosts.postID FROM seenPosts
        ON posts.id = seenPosts.postID
        WHERE seenPosts.postID = null AND seenPosts.appInstallID = $appInstallID
        LIMIT 1, OFFSET $randomNumber")
    
    queryExecute("INSERT INTO seenPosts SET postID = $randomPost.id, appInstallID = $appInstallID")
    ...
    
  • 我还想问一下,第一个想法是,从数组中创建一个临时表,并与临时表使用JOIN,而不是使用数组


    考虑这样一种想法,即对于任何给定的用户,最多需要排除600篇文章(第一种想法是600个ID的数组)。

    为什么不直接使用
    orderbyrand()LIMIT$numorandompostsneed
    ?您可以在一个查询中获得所需的随机帖子数量,而不需要重复。如果你随机查询一行600次,你会很快遇到性能问题。我听说使用RAND()效率很低。或者我太偏执了,过早地优化?过早。但我敢打赌,使用RAND once将比600个单一查询好599倍。运行多个查询将对性能产生更大的影响。每个查询都需要转到数据库,针对数据库运行并返回数据。不断地在数据库中查询一行,同时通过在id之后添加id来增加所述查询的复杂度,这不如对数据进行一次查询那么理想。也许我还应该指出,id不是连续的。可能会删除帖子,导致ID 278、279、281……这样的跳过。我想我读到了,这可能会导致兰德()运行缓慢。
    FUNCTION getRandPosts(STRING appInstallID) :
    ...
    for ...
    
    
    $randomPost = queryExecute("
        SELECT posts.* FROM posts
        JOIN seenPosts.postID FROM seenPosts
        ON posts.id = seenPosts.postID
        WHERE seenPosts.postID = null AND seenPosts.appInstallID = $appInstallID
        LIMIT 1, OFFSET $randomNumber")
    
    queryExecute("INSERT INTO seenPosts SET postID = $randomPost.id, appInstallID = $appInstallID")
    ...