Я использую разбиение на страницы с помощью CSqlDataProvider. Результат отображается правильно для первой 20 или первой страницы разбивки на страницы. Когда я вижу сообщение «Журнал» на веб-странице, запрос, который он использует, фактически выбирает 20 верхних строк для всех страниц, и это проблема. Я понятия не имею, как исправить это.
Мой контроллер имеет код:
public function actionLink() { $sql = "SELECT Ordernumber, Order_Date FROM [Orders] WHERE CAST(Order_Date As Date) BETWEEN '01-01-2014' AND '31-01-2014'"; $count = Yii::app()->db->createCommand('SELECT COUNT(*) FROM (' . $sql . ') as count_alias')->queryScalar(); $dataProvider = new CSqlDataProvider($sql, array('keyField' => 'Order_Date', 'totalItemCount' => $count, 'pagination' => array( 'pageSize' => 20,),)); $this->render('link', array('dataProvider' => $dataProvider)); }}
И теперь запрос, который он использует для подсчета, верен (сообщение журнала):
Запрос SQL:
SELECT COUNT(*) FROM (SELECT Ordernumber ,Order_Date FROM [Orders] WHERE CAST(Order_Date As Date) BETWEEN '01-01-2014' AND '31-01-2014') as count_alias
Запрос, который он использует для страницы 2 (сообщение журнала):
SELECT * FROM (SELECT TOP 20 * FROM (SELECT TOP 40 Ordernumber,Order_Date FROM [Orders] WHERE CAST(Order_Date As Date) BETWEEN '01-01-2014' AND '31-01-2014') as [__inner__]) as [__outer__]
Вышеуказанный запрос фактически даст результат в виде первых 20 строк. Его та же проблема с каждой страницей. Он дает каждый результат как одни и те же первые 20 строк. Итак, становится (сообщение журнала):
SELECT * FROM (SELECT TOP 20 * FROM (SELECT TOP 60 Ordernumber,Order_Date FROM [Orders] WHERE CAST(Order_Date As Date) BETWEEN '01-01-2014' AND '31-01-2014') as [__inner__] ) as [__outer__]
Единственная проблема, которую я вижу, – это запрос, который он использует для извлечения данных для страницы 2,3 .. и так далее. Для каждой страницы он возвращает одни и те же данные, потому что каждый раз, когда он выбирает TOP 20 строк. Я не понимаю причины такого поведения. Как выглядит запрос, когда вы используете SQL SERVER
как DB и CSqlDataProvider
качестве поставщика данных во время разбивки на страницы?