Порядок Zend_Db по значению поля

Я вывожу содержимое меню выбора из модели, используя это:

$select = $this->select();
$select->order('name');
return $this->fetchAll($select);

Однако то, что я хочу сделать, это упорядочить по определенному значению, а затем по столбцу имени. SQL будет выглядеть так:

SELECT * FROM `names` ORDER BY `name` = 'SomeValue' DESC,`name`

ОБРАЗЕЦ SQL-КОДА:

CREATE TABLE IF NOT EXISTS `names` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

INSERT INTO `names` (`id`, `name`) VALUES
(1, 'rob'),
(2, 'dave'),
(3, 'andy'),
(4, 'paul'),
(5, 'jason'),
(6, 'john');

SELECT *
FROM `names`
ORDER BY `name` = 'john' DESC , `name`

ВОЗВРАТ:

6   john
3   andy
2   dave
5   jason
4   paul
1   rob

person robjmills    schedule 29.01.2010    source источник
comment
и в каком порядке этот (очень странный) запрос возвращает записи?   -  person markus    schedule 29.01.2010
comment
$select-›order(name = 'john' DESC , name); не работает ?   -  person Rufinus    schedule 29.01.2010
comment
@tharkun: джон, энди, дейв, джейсон, пол, роб находят это немного странным...   -  person Rufinus    schedule 29.01.2010
comment
если это вернет сначала john, а затем всех остальных, то вы действительно не можете вызвать этот заказ по записи. это скорее убрать Джона из порядка, поместить его в начало, а затем упорядочить остальных по имени.   -  person markus    schedule 29.01.2010
comment
не знал, что что-то подобное существует. интересный.   -  person markus    schedule 29.01.2010
comment
нет, Сообщение: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'name = 'john'' в 'предложении заказа'   -  person robjmills    schedule 29.01.2010
comment
не могу найти это в документации mysql. Возможно, вам следует работать с IF THEN или CASE. Я думаю, в любом случае вам придется написать свой запрос, я не думаю, что оболочка Zend_Db поддерживает это.   -  person markus    schedule 29.01.2010
comment
попробуйте установить $select-›setIntegrityCheck(false)   -  person Rufinus    schedule 29.01.2010
comment
$select-›setIntegrityCheck(false) не работает, документы говорят, что в любом случае это относится только к соединениям таблиц   -  person robjmills    schedule 29.01.2010


Ответы (2)


Я считаю, что это то, что вы ищете:

$name = 'John';
$order = new Zend_Db_Expr($this->getAdapter()->quoteInto("name = ?", $name) ." DESC, `name`");
$select = $this->select();
$select->order($order);
return $this->fetchAll($select);
person Mark    schedule 29.01.2010

в зависимости от вашей базы данных SQL это не поддерживается. (я не знаю базу данных, которая может сортировать напрямую по строке.)

чего бы вы хотели добиться? иметь поля с некоторым значением на первых позициях

person Rufinus    schedule 29.01.2010
comment
Это возможно с MySQL, поскольку я использую этот запрос в более старой системе. - person robjmills; 29.01.2010
comment
возможно, не пропустив ошибку, но не сортируя, как я ожидал. Можете ли вы дать нам пример таблицы с данными и какой сортировки вы хотите добиться? - person Rufinus; 29.01.2010