--for MySQL
select a, b, c from tb limit 10, 5
--for PostgreSQL
select a, b, c from tb limit 5, 10
讓如果是用Zend Framework裡的Zend_DB_Table使用PDO又要如何下SQL語法呢?
$sql = $adapter->select()
->from(array('t' => 'tb'), array('a', 'b', 'c'))
->limit(5, 10) #沒錯,PDO_MySQL使用PostgreSQL limit的用法
->query()
->fetchAll();
今天光是找這個limit的Bug就花了我快3個小時。或許你會問,那如果我偏偏要使用MySQL limit的用法呢?ZF會讓你用嗎?
答案是會的!不過,當你call到最後的count數時,會出現嚴重錯誤。舉例,tb裡有21筆records,若用分頁方式寫PHP,每次call 10筆,則你會需要分3次(意即3頁),當你call了第一頁、第二頁時,均不會有事(因為limit(0, 10), limit(10, 10));但當你table只剩最後不到10筆,而你確指定硬call 10筆時,你所取得的array不再是一個n*10的矩陣,而會是一個n*(10 + 最後不到10筆records)的矩陣。如果你在output array時又將count值(即10筆)寫死在PHP裡,很抱歉,你的第2頁的內容會和第3頁一模一樣。
唯一的辦法就是使用PostgreSQL的用法。
tested by Zend Framework 1.7.5 edition
沒有留言:
張貼留言