2016-08-04 4 views
2

私はid、points、rankの3つのカラムを持つテーブルを持っています。タイムリーにすべてのフィールドのデータを更新して、ポイントが上下しますが、古いランキングは変わらないので、獲得したポイントに基づいてそれぞれのIDを取得する方法を見つけようとしています。PHPとMySQLiを使用して、多次元配列の値を別のマルチ配列と比較し、結果に応じてバルクデータを更新する方法は?

この表には2000以上の行があります。私はmysqliとphp5 +でそれをしたいですか?私は解決策があると思うが、1200秒のタイムアウト設定でもタイムアウトし、メモリが使い果たされる。

私のソリューションは正確に動作すると思いますが、ループのいずれかには医者が必要です。ここに私の目安は、獲得したポイントに対するランクを降順ために、すべてのポイントを取り、賞のIDその正確行くための「更新」クエリです:

<?php 
require_once $_SERVER['DOCUMENT_ROOT'].'/includes/db.inc.php'; 


$a2= mysqli_query($link, "SELECT COUNT(*) as count FROM p1"); 
$b2 =mysqli_fetch_array($a2); 
$count = $b2['count']; 

$i=1; 
while($i<=$count){ 
$a1= mysqli_query($link, "SELECT points FROM p1 ORDER BY points DESC LIMIT  $i"); 
if(!$a1){ 
echo mysqli_error($link); 
} 
while($po = mysqli_fetch_array($a1)){ 

$ross[] = $po; 
} 
foreach($ross as $pot){ 
$points=$pot['points']; 
} 

$a5a= mysqli_query($link, "SELECT id FROM p1 WHERE points = '$points'"); 

while($popo = mysqli_fetch_array($a5a)){ 

$idi=$popo; 
} 
foreach($idi as $idm){ 
$id=$idm['id']; 

$rank = $i; 
$update = mysqli_query($link,"UPDATE p1 SET rank = '$rank' WHERE points = '$points' AND id ='$id'"); 
}  
if(!$update){ 
echo "Error updating Rank".mysqli_error($link); 
} else { 
echo "Succuessul for where id = '$id' and points = '$points' set rank = '$rank'<br/>"; 
}  
$i++; 
} 
?> 
+0

ようこそスタックオーバーフロー!コードのインデントを修正してください。 – valignatev

+0

インデントを修正しました。私は推測する!今私はオタク助けて! – Unknown

+1

と申し訳ございませんが、このようなコメントをお寄せいただくことはできません。 – Zmrzka

答えて

2

私は連続したユーザーが同じ点を持っていますが、自分では

このコードは、単に一つのループを持っており、これを理解することができれば、あなたはもちろん、ランクカウンターへの変更を含むことができ、非常にスリムかつ短いコードで私のオリジナルの答えを交換しましたメモリとあなたのDBにも

<?php 
require_once $_SERVER['DOCUMENT_ROOT'].'/includes/db.inc.php'; 
$a = mysqli_query($link, "SELECT id, points, rank FROM p1 ORDER BY points DESC "); // lets get users in new ordering 
$rank = 1;         // new ranks 
while($line = mysqli_fetch_array($a)){ 
    if ($rank != $line["rank"]) {   //if old rank is different we will hit db with new value 
    echo "updating id ".$line["id"]." from rank ".$line["rank"]." to rank ".$rank." <br>"; 
    if(!mysqli_query($link,"UPDATE p1 SET rank = '".mysqli_real_escape_string($link,$rank)."' WHERE id ='".mysqli_real_escape_string($link,$line["id"])."'")) { 
     echo "Error updating Rank".mysqli_error($link); 
    } 
    }else { //if its the same we just leave the message for now 
    echo "ignoring id ".$line["id"]." previous rank ".$line["rank"]." , new rank ".$rank." <br>"; 
    } 
    $rank++; // next user so lets increment the counter 
} 
?> 
+0

よろしく!おとこ。あなたのような天使がいることをうれしく思います。それはクールで効率的です。私は完璧と言う必要があります。もう一度ありがとう、あなたは私の悟りです。 – Unknown

0

は最近、問題の同じ種類を経て、のような単純な解決策を見つけましたたくさんの苦労した後、私はあなたの投稿に言及しなかったあなたの入力と予想される結果にもよりますが、それを明確にしたいと思います。

if (preg_match('/"'.<value>.'"/i' , json_encode(<your array>))) { 
    echo "Match"; 
} else { 
    echo "Doesn't match"; 
} 

試しに応じて値を変更してください!それを読んでくれてありがとう。

+0

私の目標はif($ id == $ max ['points']){then rank = 1、ここでid = '$ id'は二番目の最大点を持つ人物が2ランクに。あなたが答えを知っていると思うなら、それに従って私のコードを編集して、それを送り返してください。 – Unknown

+0

preg_match( '/"'$$。' "/ i '、json_encode($ max [' points '])))? –

+0

申し訳ありませんあなたを気にしたくないのですが、実際にコードをどこに変更するのか正確には分かりません。 3つの配列にはランクがあり、別の配列にはidがあり、最後にはポイントがあります。idは使用する必要はありませんが、maxをmin points rankings 1 ++に割り当てる必要があります。多分私は私の質問をはっきりと伝えることができません。 – Unknown

0

が節約され、次の応答コードは、すべての点、および関連するidを取り、それぞれの低いポイントに高に対して低ランクの高い設定されます。ただし、同じポイントのホルダーIDに対して同じランクを割り当てることはありません。それはできますが、現在は必要ありません。

<?php 
require_once $_SERVER['DOCUMENT_ROOT'].'/includes/db.inc.php'; //connection to the DB 
$a1= mysqli_query($link, "SELECT id, points FROM p1 ORDER BY points DESC"); //Selecting High to low all points 
if(!$a1){ 
echo mysqli_error($link); 
} 
while($po = mysqli_fetch_array($a1)) {                                    

$rose[] = $po; 

} 

$rank=0;//set rank 0 

foreach($rose as $ro) { //splitting each row of array with unlimited rows 

$points=$ro['points']; 
$id=$ro['id']; 

$rank++; //adding 1 each time foreach loops repeats itself until no row left 
$update = mysqli_query($link,"UPDATE player1 SET rank = '$rank' WHERE points = '$points' AND id ='$id'"); //sending update command 

if(!$update) { //echoing out what the hell this code is f****** 
echo "Error updating Rank".mysqli_error($link); 
} else { 
echo "Succuessul for where id = '$id' and points = '$points' set rank = '$rank'<br/>"; 
} 
} 
?> 
+1

@halferはいそれはあります、そして、他の人もトリックを行います。 – Unknown

関連する問題