iT邦幫忙

0

PHP抓取前後資料

php

table裡面用一個叫sort的欄位降冪排序
如何抓出前2後2的資料?
假設table現存有的sort有
20、18、15、11、10、9、6、4、3、2
當sort為11時,如何找出18、15、10、9這幾個數字呢?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
fillano
iT邦超人 1 級 ‧ 2010-07-15 15:50:53
最佳解答

我覺得一個方法是在程式中維護好sort欄位,讓他是連續的數列(既然用了sort,那想必資料不會很多),這樣查詢會比較好寫,缺點是維護sort欄位的成本很高。

其實做兩次查詢,靠條件 + order by + limit也是可以解決的,而且很快。

chan15 iT邦新手 3 級 ‧ 2010-07-15 20:05:19 檢舉

這是之前升冪的寫法,有寫過,但就覺得好像不夠聰明

前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);

fillano iT邦超人 1 級 ‧ 2010-07-19 14:48:25 檢舉

要在一個query做出來,那一定要用到subquery。

fillano iT邦超人 1 級 ‧ 2010-07-19 14:55:01 檢舉

也許可以更簡單...我用了三層query...汗

&lt;pre class="c" name="code">
SELECT * FROM test
WHERE sort
BETWEEN
(SELECT min(sort) FROM (SELECT sort FROM test WHERE sort&lt;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;
2
何必問
iT邦好手 1 級 ‧ 2010-07-15 15:03:49

以你的情況
我的方式是
應該是把資料query出來之後
丟進array陣列變數
cout該陣列個數
再以loop方式去驗證陣列第幾個值等於11
取出該順位數前二和後二陣列值

&lt;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&lt;=$num;$x++){  
  if( $a[$x] == 11){  
//此處未驗證當位數前第一位和最後一位時  
//取值的判斷, 純粹以你的描述來取值;  
            $ANSWER = $a[$x-2].','.$a[$x-1].','.$a[$x+1].','.$a[$x+2]; //答案  
  }  
}  
echo $ANSWER; 

我要發表回答

立即登入回答