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));
}
我无法对此进行测试,但我想你可以看到我正在尝试做什么?
我想创建一个函数来生成随机排名。我有一个成员 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));
}
我无法对此进行测试,但我想你可以看到我正在尝试做什么?