Zend Framework - применение порядка по вложенному запросу - PullRequest
2 голосов
/ 24 марта 2010

Это может быть очень простой вещью. Проверьте нормальный SQL-запрос ниже

(select * from shopping order by shopping_id desc limit 5) order by RAND()

Этот запрос успешно выполняется в mysql - не уверен, что это правильный способ - но он работает. Он получает последние 5 идентификаторов из таблицы покупок и случайным образом заказывает их каждый раз

Я хочу добиться этого в Zend. Я не уверен, как выполнить первую часть, а затем применить предложение RAND к результатам - то, что у меня ниже, не делает этого.

$select = $this->select()       
           ->from(array('sh'=>'shopping'))
           ->order('shopping_id desc')
           ->limit(5)    
           ->order('RAND()');

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

Почему бы не использовать немного другой подход, который даст те же результаты. Если вы отбросите вложенный выбор и order by RAND(), вы сможете очень быстро получить строки из базы данных, а затем, когда будете работать со строками, вы всегда сможете их рандомизировать.

$select = $this->select()       
       ->from(array('sh'=>'shopping'))
       ->order('shopping_id desc')
       ->limit(5)    

$rows = $this->fetchAll($select);

// take it from a rowset object, convert to an array:
$rowArray = array();
foreach ($rows as $row) $rowArray[] = $row;
shuffle($rowArray);
1 голос
/ 29 марта 2010

Класс Zend_Db_Expr позволяет вам сделать это. Вы создаете новый экземпляр класса Zend_Db_Expr и, используя его конструктор, передаете выражение как строку: «RANDOM ()».

$ select = $ this-> select ()
-> из (массива ( 'ш' => 'покупок')) -> заказ ('shopping_id desc') -> предел (5)
-> заказ (новый Zend_Db_Expr ('RANDOM ()'));

...