2013-12-16 45 views
-1

嗨,我需要得到的結果,並應用order by只在有限的部分。你知道,當你申請順序由您訂購的所有行,我要的是排序僅在有限的部分,這裏有一個例子:我怎樣才能「排序」僅限於mysql查詢中的LIMIT結果?

// all rows 
SELECT * FROM users ORDER BY name 

// partial 40 rows ordered "globally" 
SELECT * FROM users ORDER BY name LIMIT 200,40 

解決的辦法是:

// partial 40 rows ordered "locally" 
SELECT * FROM (SELECT * FROM users LIMIT 200,40) AS T ORDER BY name 

這解決方案運行良好,但存在一個問題:我正在處理需要表中的TOTAL行數的Listview組件(使用SQL_CALC_FOUND_ROWS)。如果我使用這個解決方案,我無法得到這個總數,我會得到有限的部分數(40)。

我希望你能給我基於查詢的解決方案,比如像:「ORDER BY LOCALLY

+0

所以你只希望行1-40排序? –

+0

'SELECT * FROM users LIMIT 200,40'將導致** UNDETERMINED **結果。這是如何工作的?你的預期產出是多少? –

+0

爲什麼「UNDETERMINED」,200是偏移量,40是計數,它的工作原理是 –

回答

0

由於您使用PHP,還不如讓事情變得簡單,對不對?它可能只在MySQL中做到這一點,但爲什麼複雜的東西? (另外,將MySQL服務器上的負載少始終是一個好主意)

$result = db_query_function("SELECT SQL_CALC_FOUND_ROWS * FROM `users` LIMIT 200,40"); 
$users = array(); 
while($row = db_fetch_function($result)) $users[] = $row; 

usort($users,function($a,$b) {return strnatcasecmp($a['name'],$b['name']);}); 

$totalcount = db_fetch_function(db_query_function("SELECT FOUND_ROWS() AS `count`")); 
$totalcount = $totalcount['count']; 

請注意,我用編造的功能名稱,以表明這是圖書館無關;)子在您選擇的功能。

相關問題