我正在开发一个应用程序,它从sql server请求数据并将其显示给用户。
当数据显示时,使用可以单击返回或下一步以查看下一个或上一个数据。
一旦用户收到数据,应用程序就会将其缓存在本地地图中,以减少对服务器的调用。 为了使兑现数据正常工作,应用程序从sql server获取每行的最小和最大索引。
在用户浏览应用程序时将新数据插入sql数据库时出现问题,因为在此时最大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 :(得分:0)
无需保持最大和最小记录数。只需将最新记录计数保留为$ offset,然后将$ count作为行数发送给它。
$ offset是您在下次请求之前收到的最新行数。
$ count是偏移后从此查询中需要的行数。
示例中的查询将是:
SELECT * FROM `table` order by `id` desc LIMIT $offset, $count
上面的查询将为您提供最新的唯一结果,而不会有任何重复的行。
如果你不想修改你的服务器代码,另一个想法是这样的:首先缓存app的本地数据库中的行,然后通过使用“GROUP BY server_id
”或使用查询从中获取它们来显示它们独特的插入而非此。