ORDER BY FIELD()

Главные вкладки

Комментарии

Аватар пользователя Chyvakoff Chyvakoff 1 апреля 2012 в 16:29

"drupby" wrote:
где же там появляется конкатенация ?

Нигде.
Странно вообще что ТС в семерке так запросы составляет.

Аватар пользователя ydv ydv 1 апреля 2012 в 18:41

Chyvakoff wrote:
А тут?

там тоже нет.
мне не надо конкатенации, мне надо использовать в запросе mysql выборочную сортировку и функцию FIELD(), тут написано что это такое http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field.
Поэтому вопрос, что мне написать в ->orderBy()?

Аватар пользователя drupby drupby 1 апреля 2012 в 18:48

"ydv" wrote:
ORDER BY FIELD('table.title', 'SS','NM','EX','VG+','VG','G','POOR'), table.title DESC

А смысл такой сортировки ?
Да и ", table.title DESC" в конце запроса зачем?

Аватар пользователя ydv ydv 1 апреля 2012 в 18:53

Смысл этой сортировки в том что из таблицы будут полученные поля отсортированные именно в таком порядке как указано, сначала поля у которых значения SS, потом NM и тд.
table.title DESC в конце можно опустить, это не принципиально

Аватар пользователя ydv ydv 1 апреля 2012 в 19:29

нет там этого.
ну ок, еще пояснение
orderBy($field, $direction) - это тоже самое что в запросе написать ORDER BY '$field' ASC (или DESC)
как мне написать ORDER BY FIELD('$field', 'xx', 'yy')?

Аватар пользователя Chyvakoff Chyvakoff 2 апреля 2012 в 9:02
$q=db_select('table','t');
$q->orderBy('t.title','desc');
$q->orderBy('t.NM','desc');
$q->orderBy('t.EX','desc');
$q->orderBy('t.VG+','desc');
$q->orderBy('t.VG','desc');
$q->orderBy('t.G','desc');
$q->orderBy('t.POOR','desc');
$q->execute();

Проверь такой код.

Аватар пользователя ser_house ser_house 2 апреля 2012 в 16:01
  $select = db_select('node', 'n')
    ->fields('n', array('nid'))
    ->addTag('node_access')
    ->orderBy('FIELD(n.nid, 235, 236, 234, 237)')
    ->condition('n.nid', array(235, 236, 234, 237), 'IN');

На что debug($select->__toString(), 'select', TRUE); даст такой вывод:

SELECT n.nid AS nid
FROM
{node} n
WHERE  (n.nid IN  (:db_condition_placeholder_0, :db_condition_placeholder_1,
:db_condition_placeholder_2, :db_condition_placeholder_3))
ORDER BY FIELD(n.nid, 235, 236, 234, 237) ASC

После выполнения:

  $result = $select->execute()->fetchAll();

debug($result, 'result', TRUE); дает следующий вывод:

Array
(
    [0] => stdClass Object
        (
            [nid] => 235
        )

    [1] => stdClass Object
        (
            [nid] => 236
        )

    [2] => stdClass Object
        (
            [nid] => 234
        )

    [3] => stdClass Object
        (
            [nid] => 237
        )

)

Если убрать условие WHERE будет выведен весь список с нашими нодами в конце, отсортированными как указано:

Array
(
    ...

    [304] => stdClass Object
        (
            [nid] => 103
        )

    [305] => stdClass Object
        (
            [nid] => 104
        )

    [306] => stdClass Object
        (
            [nid] => 114
        )

    [307] => stdClass Object
        (
            [nid] => 235
        )

    [308] => stdClass Object
        (
            [nid] => 236
        )

    [309] => stdClass Object
        (
            [nid] => 234
        )

    [310] => stdClass Object
        (
            [nid] => 237
        )

)

Это в orderBy умолчальный порядок: asc. Если его изменить на desc

->orderBy('FIELD(n.nid, 235, 236, 234, 237)', 'desc');

наши ноды будут выведены вверху списка в обратном порядке:

Array
(
    [0] => stdClass Object
        (
            [nid] => 237
        )

    [1] => stdClass Object
        (
            [nid] => 234
        )

    [2] => stdClass Object
        (
            [nid] => 236
        )

    [3] => stdClass Object
        (
            [nid] => 235
        )

    [4] => stdClass Object
        (
            [nid] => 210
        )

    [5] => stdClass Object
        (
            [nid] => 211
        )

    ...

Во-о-о-т...