我覺得一個方法是在程式中維護好sort欄位,讓他是連續的數列(既然用了sort,那想必資料不會很多),這樣查詢會比較好寫,缺點是維護sort欄位的成本很高。
其實做兩次查詢,靠條件 + order by + limit也是可以解決的,而且很快。
這是之前升冪的寫法,有寫過,但就覺得好像不夠聰明
前2就是
sprintf("SELECT id FROM table WHERE sort > %s ORDER BY p_sort ASC LIMIT 0, 2", $sort);
開新視窗(view plain) | 列印(print) | ?
sprintf("SELECT id FROM table WHERE sort > %s ORDER BY p_sort ASC LIMIT 0, 2", $sort);
然後用迴圈把值存進陣列$retArr組合
前2這樣的抓法結果會對但順序不對
所以要反轉$ret = implode('',array_reverse($retArr));
再return回去
後2比較簡單,撈出來組合好以後就可以return回去了
sprintf("SELECT id FROM table WHERE sort < %s ORDER BY p_sort DESC LIMIT 0, 2", $sort);
要在一個query做出來,那一定要用到subquery。
也許可以更簡單...我用了三層query...
<pre class="c" name="code">
SELECT * FROM test
WHERE sort
BETWEEN
(SELECT min(sort) FROM (SELECT sort FROM test WHERE sort<11 ORDER BY sort DESC limit 2) AS b)
and
(SELECT max(sort) FROM (SELECT sort FROM test WHERE sort>11 ORDER BY sort limit 2) AS a)
ORDER BY sort;
以你的情況
我的方式是
應該是把資料query出來之後
丟進array陣列變數
cout該陣列個數
再以loop方式去驗證陣列第幾個值等於11
取出該順位數前二和後二陣列值
<pre class="c" name="code">$sql = "select SORT from SOMETABLE order by SORT desc";
$query = mssql_query( $sql, $DB_CONNECT) ;
$num = mssql_num_rows($query);
while( list($SORT) = mssql_fetch_row($query) ){
$a[] = $SORT;
}
for($x=0;$x<=$num;$x++){
if( $a[$x] == 11){
//此處未驗證當位數前第一位和最後一位時
//取值的判斷, 純粹以你的描述來取值;
$ANSWER = $a[$x-2].','.$a[$x-1].','.$a[$x+1].','.$a[$x+2]; //答案
}
}
echo $ANSWER;