Haskell и REBOL являются оба захватывающими языками по совсем другим причинам.
Haskell может действительно открыть Ваши глаза как разработчик, с понятиями как монады, частичное приложение, сопоставление с образцом, алгебраические типы, и т.д. Это - шведский стол для любопытного программиста.
REBOL, не сутулятся также. Это обманчиво просто сначала, но когда Вы начинаете копаться в понятиях как контексты, диалекты СИНТАКСИЧЕСКОГО АНАЛИЗА и Bindology, Вы понимаете, что существует намного больше, чем кажется на первый взгляд. Хорошая вещь о REBOL состоит в том, что намного легче начать с ним, чем с Haskell.
я не могу решить, который я люблю лучше.
Вы можете быстро абстрагировать функцию в таблицу - кто знает, какой адаптер она использует:
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 и заставить его вычислять новое значение для каждой строки.
Я бы создал класс My_Db_Expr_Rand extends Zend_Db_Expr. На базе переходника я бы вернул либо то, либо другое.