Php 生成从 table 1 到 table 2 的数据,但会在 1000 行后复制

Php genarate data from table 1 to table 2 but will duplicate after 1000 rows

我想创建一个函数来生成随机排名。我有一个成员 table 呼叫 t1_user,我想在我的第二个 table t2_rank 为空时从 t1_user ORDER BY RAND()

我的 t1_user table 有 5400 行数据,所以我想像每 500 行数据然后 REPLACE INTO 一样拆分数据。我正在使用 Discuz! 模板语言。

我的t1_user数据(5400+记录,无重复)

+--------------------+
| id      | name     |
+--------------------+
| 1       | abc      |
| 2       | hahaha   |
| 3-999.....         |
| 1000    | abcdef   |
| 1001    | ohyeah   |
| 1002    | nci      |
----------------------

在我 运行 我的代码之后,将把下面的数据插入到我的 t2_rank table

+---------+----------+--------+
| id      | name     | rank   |
+-----------------------------+
| 1       | abc      | 1      |
| 2       | hahaha   | 2      |
| 1000    | abcdef   | 1000   | //until here is fine
| 1001    | abc      | 1001   | //wrong, will insert data of row1 and continue data of row2...
| 1002    | hahaha   | 1002   |
+-----------------------------+

我目前的编码如下。

$checkfirst = DB::result_first("SELECT count(*) cnt FROM ".DB::table('t2_rank').""); //template language DB::
if($checkfirst == 0){
    $s = DB::fetch_all("SELECT * FROM ".DB::table('t1_user')." ORDER BY RAND();");
    $x = 1;
    foreach($s as $su){
        $newdata[$x] = '('.$x.','.$id.')';
        $x++;
    }
        
    $pagesplit = 500;//500 row split
    $firstpage = 0;
    $tpp = $pagesplit;
    $runningtime = ceil(count($s)/$pagesplit);      

    for($y=1;$y<$runningtime;$y++){
        $genewdata = array_slice($newdata, $firstpage, $tpp);
        $tobeupdate = implode(',',$genewdata);
        DB::query("REPLACE INTO ".DB::table('t2_rank')." (rank,id) VALUES ".$tobeupdate."");
                    
        $firstpage = $firstpage+$pagesplit;
        $tpp = $tpp+$pagesplit;
        if($tpp >= count($s)){
            $tpp = count($s);
        }
    }
}

请问我的代码有什么问题吗?谢谢。

您想逐步更新数据,一次更新 500 行。您这样做的代码相当复杂。这样你就无法追踪正在发生的事情。您似乎混淆了 $tpp$firstpage 变量。难怪,鉴于他们的名字。这是我的建议:

$totalRowCount = count($s);
$replaceCount = 500;
for ($offset = 0; $offset < $totalRowCount; $offset = $offset + $replaceCount) {
    $replaceData = array_slice($newdata, $offset , $replaceCount);
    DB::query("REPLACE INTO " . DB::table('t2_rank') . 
              " (rank,id) VALUES " . implode(',', $replaceData));
}

我无法对此进行测试,但我想你可以看到我正在尝试做什么?