2010-03-24 4 views
2

Это может быть очень простая вещь. Проверьте обычный запрос SQL нижеZend Framework - применение порядка по вложенному запросу

 
(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()'); 
+0

Я уверен, что родной Zend_Db не будет делать подзапросы. Вы можете легко уйти от 'в заказ по RAND()', а затем пусть ваш Rowset код/​​PHP рандомизации 5 записей ... – gnarf

+0

@gnarf Zend_Db_Select может очень сделать подзапросы. Вам просто нужно поместить их в запрос с помощью Zend_Db_Expr. – Gordon

+0

Я буду следовать предложению @ gnarf, считая «ORDER BY RAND()» обходить кеш запросов. – leek

ответ

2

Почему бы не принять несколько иной подход, который достигнет тех же результатов. Если вы отбросите подзапрос и 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); 
+0

@Gublooo - Вот вы, версия моего комментария, достойная быть ответом :) – gnarf

1

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

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