Zend_Db_Select заказывают случайным, совместимым в mssql / mysql

Haskell и REBOL являются оба захватывающими языками по совсем другим причинам.

Haskell может действительно открыть Ваши глаза как разработчик, с понятиями как монады, частичное приложение, сопоставление с образцом, алгебраические типы, и т.д. Это - шведский стол для любопытного программиста.

REBOL, не сутулятся также. Это обманчиво просто сначала, но когда Вы начинаете копаться в понятиях как контексты, диалекты СИНТАКСИЧЕСКОГО АНАЛИЗА и Bindology, Вы понимаете, что существует намного больше, чем кажется на первый взгляд. Хорошая вещь о REBOL состоит в том, что намного легче начать с ним, чем с Haskell.

я не могу решить, который я люблю лучше.

5
задан OMG Ponies 25 September 2009 в 16:03
поделиться

2 ответа

Вы можете быстро абстрагировать функцию в таблицу - кто знает, какой адаптер она использует:

class MyTable extends Zend_Db_Table_Abstract {
   public function randomSelect($select=null) {
     if ($select === null) $select = $this->select();
     if (!$select instanceOf Zend_Db_Select) $select = $this->select($select);
     $adapter = $this->getAdapter();
     if ($adapter instanceOf Zend_Db_Adapter_Mysqli) {
       $select->order(new Zend_Db_Expr('RAND()'));
     } else if ($adapter instanceOf Zend_Db_Adapter_Dblib) {
       $select->order(new Zend_Db_Expr('NEWID()'));
     } else { 
       throw new Exception('Unknown adapter in MyTable');
     }
     return $select;
  }
}

$someSelect = $table->select();
// add it to an existing select
$table->randomSelect($someSelect);

// or create one from scratch
$select = $table->randomSelect();

Кроме того, я где-то нашел статью, которую я потерял, в которой рекомендуется попробовать что-то вроде:

$select->order(new Zend_Db_Expr('0*`id`+RAND()));

чтобы подорвать оптимизатор запросов MSSQL и заставить его вычислять новое значение для каждой строки.

14
ответ дан 18 December 2019 в 10:46
поделиться

Я бы создал класс My_Db_Expr_Rand extends Zend_Db_Expr. На базе переходника я бы вернул либо то, либо другое.

2
ответ дан 18 December 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: