2016-11-15 7 views
0

ソートされたデータを持つ大きなMySQLテーブルがあります。私は出発点を見つける必要があるとき、私は下限のID(自動増分)を見つけるためにバイナリ検索を実行します。唯一の問題は、一部のデータが削除された後で、アルゴリズムによって与えられたIDが存在しない場合は、より低いIDを持つ最初の既存の行を調べる必要があることです。これを達成するためにこのコードをどのように変更する必要がありますか?削除された行を持つMySQLテーブルのバイナリ検索PHP

$l = 1; 
$h = $max; //SELECT MAX(id) 
while ($h - $l > 1){ 
    $m = ($h + $l)/2; 
    $q = mysqli_query($db, "SELECT col FROM tab WHERE id=". floor($m)); 
    $result = array(); 
    while($result[] = mysqli_fetch_row($q)){;} 
    if ($result[0][0] < $val) $l = $m; 
    else $h = $m; 
} 
echo round($m); 

は、例えば、私が12345を超えるCOLの値を持つ行を検索すると、テーブルは、私は、行5000を見て開始し、最大ID 10000を有する場合COL 7500次に= 9000、(COL = 13000)、6250が削除されているので、ID < 6250の第1の既存行を探し始め、6245にcol = 10500があることがわかりました。今度はID 6873と7500の間を探しています。

+0

:あなたは、この(制限は、クエリリターンのみ1の結果を作るものです)か、ID 300より<で最初の行を取得したいのですがしかし、私はこれがそれを行う方法ではないと確信しています。 –

答えて

0

右これを行う方法

あなたはこのようなテーブルを持っています:

| ID | col | 
--------------- 
| 1 | 15 | 
| 3 | 155 | 
| 18 | 9231| 
| 190 |14343| 
| 500 |16888| 

あなたは次のクエリで14343を見つける得ることができます:

SELECT ID, col FROM the_table WHERE col>12345 LIMIT 1; 

それはより速く行うには、あなたは、インデックスを追加する必要があると思います(索引語がグーグルの価値がある)その後

ALTER TABLE `the_table` ADD INDEX `col` (`col`); 

mysqlは内部的にツリー構造を作成し、はあなたのためにバイナリ検索を行います

これあなたが要求費につき+他の複数のネットワーク・ラウンドトリップを避けるだろうとずっと速く働くことになります(クエリの解析、最適化、すべてのロックを&ミューテックス、...)

回答あなたの質問に

Iは低いIDを有する第1の既存の行を見て必要

例: 、私は本当にあなたが達成しようとしているのか理解していない

SELECT col FROM the_table WHERE ID < 300 LIMIT 1; 
関連する問題