2016-06-18 2 views
0

現在、SQL Serverからデータを要求してユーザーに表示するアプリケーションで作業しています。mySqlからの行の取得PHPによる特定のポイントからの降順

データが表示されているときは、前後にクリックして次または前のデータを表示できます。

ユーザーがデータを受信すると、アプリケーションはローカルマップにキャッシュしてサーバーへの呼び出しを減らします。 キャッシュされたデータが正しく動作するためには、アプリケーションはSQL Serverから各行の最小値と最大値を取得します。

ユーザーがアプリケーションをブラウズしている間に新しいデータが挿入されると、その時点で最大IDが変更されるため、アプリケーションが新しいデータを要求すると、現在の最大IDが評価されるため、そのインデックスはすでに持っているので、最大インデックスは最新のデータを表しているので、ユーザーは重複した行を見ることがあります。

私が考えていた解決策は、インデックス値がキャッシュされた最大インデックス値よりも小さいかどうかをチェックすることによってSQL Serverが取得できる行を制限していますが、これを実装する方法がわかりません。

質問:

行フィールドの値が一定量の下であれば、私はデータのみを取得するためにSQL Serverを照会することができますか?

コード:

$connect=mysqli_connect(HOST,USERNAME,PASSWORD,DB) or die ('error: '. mysql_error()); 

$MAXID = $_POST['MAX']; 
$MINID = $_POST['MIN']; 

$ORDERBY_TYPE = $_POST['TYPE']; 
$LIMIT = $_POST['LIMIT']; 
$OFFSET = $_POST['OFFSET']; 

$ORDERBY = ""; 

$SKIP = false; 

switch($ORDERBY_TYPE){ 
case 0: 
    $ORDERBY = "ORDER BY RATING"; 
    //$ORDERBY = "WHERE VOTES > 5 ORDER BY RATING" <--- replace the upper line by this line some day 
    break; 
case 1: 
    $ORDERBY = "ORDER BY ID"; 
    break; 
case 2: 
    $SKIP = true; 
    break; 
default: 
    $ORDERBY = "ORDER BY ID"; 
} 

$query = ""; 

if($SKIP) 
{ 
//adding to the minimum id the amount needed to retrive 
$MINID += $LIMIT; 

//checking if there are more records then the amount needed <--- only in fresh start this is usefull 
if($MINID<$MAXID) 
{ 
    //getting a random id between the maximun id and the minimum id    after adding the amount needed 
    $randomId = mt_rand($MINID,$MAXID); 

    //setting offset to be skipped - that is the "distance" between the max id and the random id 
    $OFFSET = $MAXID - $randomId; 
    } 
    else 
{ 
    $OFFSET = 0; 
} 
//getting the amount of records needed after skipping the "random" modefied value 
$query = "SELECT * FROM `ugcl` ORDER BY ID DESC LIMIT ". $LIMIT ." OFFSET ". $OFFSET .""; 
} 
else 
{ 
$query = "SELECT * FROM `ugcl` ". $ORDERBY ." DESC LIMIT ". $LIMIT ." OFFSET ". $OFFSET .""; 
} 

$result = mysqli_query($connect,$query); 

if($result) 
{  
$fields = array(); 

$col_query = "SHOW COLUMNS FROM `ugcl`"; 
$col_result = mysqli_query($connect,$col_query); 

while($row = mysqli_fetch_array($col_result)){ 
    array_push($fields, $row['Field']); 
} 

$fake_count = 0; 

echo "["; 
while ($array = mysqli_fetch_row($result)) { 

    echo "{"; 
    echo '"'; 
    echo $fake_count; 
    echo '"'; 
    echo ":"; 
    echo "{"; 
    for($i = 0 ; $i < count($array) ; $i++){ 
     if($i > 0) echo ","; 
     echo '"'; 
     echo $fields[$i]; 
     echo '"'; 
     echo ":"; 
     echo '"'; 
     echo $array[$i]; 
     echo '"'; 
    } 
    echo "}"; 
    echo "},"; 
    $fake_count++; 
} 
echo "]"; 
} 
else 
{ 
echo "error"; 
} 
+0

発明ホイールを停止します。最後の__30__行で行うすべてを行う 'json_encode'関数があります。 –

+0

@u_mulder私はjson_encodeを試しましたが、各行のフィールドの1つは1k文字以上のjsonです。json_encodeを使用すると、そのフィールドのデータが乱され、 "\" charが追加されました。私のアプリで正しい方法で、私はちょうど私の自己それをやった。しかし、どうもありがとうございます:) – gggggguy

+0

あなたのデータベースがSQL ServerかMySQLかどうかを明確にしてください。適切でないタグを削除します。 – Alex

答えて

0

カウント最大と最小の記録の両方を維持する必要はありません。最新のレコード数を$ offsetとして保存し、それの後ろの行数として$ countで送信してください。

$ offsetは、次回のリクエスト前に受け取った最新の行数です。

$ countは、オフセット後にこのクエリからいくつの行を使用するかを指定します。サンプル中

クエリは次のようになります。

SELECT * FROM `table` order by `id` desc LIMIT $offset, $count 

クエリの上に任意の重複行せずに、あなたに、最新のユニークな結果が得られます。

サーバーコードを変更したくない場合は、まずアプリのローカルDBの行をキャッシュしてから、「GROUP BY server_id」を使用してクエリを取得して表示するか、代わりにユニークな挿入を使用しますこれの。

物事を単純にしてください。

関連する問題