2017-01-18 4 views
1

10000000(8桁)から999999999(10桁)の範囲でMySQLからの数値があります。それは連続しているはずですが、欠けている数字があります。私はどの番号が欠落しているか知る必要があります。PHPのarray_diffより速い方法がありますか

範囲が巨大です。最初に私はこれを行うためにPHPを使用するつもりでした:

//MySqli Select Query 
$results = $mysqli->query("SELECT `OCLC Number` FROM `MARC Records by Number`"); 

$n_array = array(); 
while($row = $results->fetch_assoc()) { 
    $n_array[] = $row["OCLC Number"]; 
} 

d($n_array); 
foreach($n_array as $k => $val) { 
    print $val . " "; 
} 

/* 8 digits */ 
$counter = 10000000; 
$master_array = array(); 

/* 10 digits */ 
while ($counter <= 9999999999) { 
    $master_array[] = $counter; 
    $counter++; 
    d($master_array); 
} 
d($master_array);  

$missing_numbers_ar = array_diff ($master_array, $n_array); 
d($missing_numbers_ar); 

d()は、var_dump()に似たカスタム関数です。

しかし、私はこれが完了するまでに何時間もかかることに気付きました。 15分の時点で、$ master_arrayには4000個の数字だけが入力されています。

これをより迅速に行うにはどうすればよいですか? MySQLのみまたはMySQLとPHPの両方のソリューションを歓迎します。最適な解決策が欠落している番号の数に依存する場合は、どうすればいいか教えてください。 Tq。

+2

デュープ:http://stackoverflow.com/questions/4340793/how-to-find-gaps-in-sequential-numbering-in-mysql – nogad

+0

あなたがあなたのテーブルに100億件のレコードを持っているとは考えにくいです。データベース内のすべてのIDをフラットファイルにダンプしてソートし、テキストファイルの行ごとに繰り返していくことでどのような違いがあるのか​​を確認するだけです。それは通常、本当に速く実行されます。 – tadman

+0

[mysqlの連続番号付けの隙間を見つける方法?](http://stackoverflow.com/questions/4340793/how-to-find-gaps-in-sequential-numbering-in-mysql) – imel96

答えて

1

あなたd()は、おそらく遅さの原因である、それを取り外してから、次はまだ私は驚くだろう遅い場合は、あなたのコード内の小さな変化

while($row = $results->fetch_assoc()) { 
    $n_array[$row["OCLC Number"]] = 1; 
} 

$missing_numbers_ar = []; 

while ($counter++ <= 9999999999) { 
    if (empty($n_array[$counter])) { 
     $missing_numbers_ar[] = $counter;   
    } 
} 
0

してください。私はまた、それが@Hieu Voの答えに似ていることに気づいた。

// Make sure the data is returned in order by adding 
// an `ORDER BY ...` clause. 
$results = $mysqli->query("SELECT `OCLC Number` 
      FROM `MARC Records by Number` 
      ORDER BY `OCLC Number`"); 

$n_array = array(); 
while($row = $results->fetch_assoc()) { 
    // Add the "OCLC Number" as a key to the array. 
    $n_array[$row["OCLC Number"]] = $row["OCLC Number"]; 
} 

// assume the first array key is in fact correct 
$i = key($n_array); 
// get the last key, also assume it is not missing. 
end($n_array); 
$max = key($n_array); 
// reset the array (should not be needed) 
reset($n_array); 
do { 
    if (! $n_array[$i]) { 
     echo 'Missing key:['.$i.']<br />'; 
     // flush the data to the page as you go. 
     flush(); 
    } 
} while(++$i <= $max); 
関連する問題