Еще один сложный порядок MySQL - PullRequest
2 голосов
/ 26 января 2011

Я искал SO для ответа, но, похоже, мой конкретный случай немного отличается от остальных.

В основном мои данные состоят из некоторых "основных" записей с "позицией" (acts_as_listв RoR), а затем любое количество «настраиваемых» записей с настраиваемой_позицией, чтобы отразить основную позицию.Желаемым результатом является получение набора, содержащего мастер + пользовательские записи, упорядоченные по master1, custom1 ..., master2, custom2 ...,

Основные записи будут иметь значение NULL custom_position;пользовательские записи будут иметь настраиваемую_позицию, равную позиции их мастера.

исходные данные, не отсортированные:

name        sort_a   sort_b
====        ======   ======
Lorem       1        NULL
ipsum       2        NULL
dolor       3        NULL
Lorem foo   4        1
ipsum foo   5        2
dolor foo   6        3
Lorem bar   7        1
ipsum bar   8        2
dolor bar   9        3
Lorem duck  10       1
ipsum duck  11       2
dolor duck  12       3

требуемая сортировка:

name        sort_a   sort_b
====        ======   ======
Lorem       1        NULL
Lorem foo   4        1
Lorem bar   7        1
Lorem duck  10       1
ipsum       2        NULL
ipsum foo   5        2
ipsum bar   8        2
ipsum duck  11       2
dolor       3        NULL
dolor foo   6        3
dolor bar   9        3
dolor duck  12       3

ближе всего я получил: упорядочить по coalesce (sort_a, sort_b) asc

name        sort_a   sort_b
====        ======   ======
Lorem foo   4        1
Lorem bar   7        1
Lorem duck  10       1
Lorem       1        NULL
ipsum foo   5        2
ipsum bar   8        2
ipsum duck  11       2
ipsum       2        NULL
dolor foo   6        3
dolor bar   9        3
dolor duck  12       3
dolor       3        NULL

Любая идея, как мне добиться желаемой сортировки в ORDER BYпункт

Ответы [ 2 ]

5 голосов
/ 26 января 2011
SELECT  *
FROM    mytable
ORDER BY
        COALESCE(sort_b, sort_a), sort_a

Запрос на проверку:

SELECT  *
FROM    (
        SELECT  'Lorem' AS name, 1 AS sort_a, NULL AS sort_b
        UNION ALL
        SELECT  'ipsum' AS name, 2 AS sort_a, NULL AS sort_b
        UNION ALL
        SELECT  'dolor' AS name, 3 AS sort_a, NULL AS sort_b
        UNION ALL
        SELECT  'Lorem foo' AS name, 4 AS sort_a, 1 AS sort_b
        UNION ALL
        SELECT  'ipsum foo' AS name, 5 AS sort_a, 2 AS sort_b
        UNION ALL
        SELECT  'dolor foo' AS name, 6 AS sort_a, 3 AS sort_b
        UNION ALL
        SELECT  'Lorem bar' AS name, 7 AS sort_a, 1 AS sort_b
        UNION ALL
        SELECT  'ipsum bar' AS name, 8 AS sort_a, 2 AS sort_b
        UNION ALL
        SELECT  'dolor bar' AS name, 9 AS sort_a, 3 AS sort_b
        UNION ALL
        SELECT  'Lorem duck' AS name, 10 AS sort_a, 1 AS sort_b
        UNION ALL
        SELECT  'ipsum duck' AS name, 11 AS sort_a, 2 AS sort_b
        UNION ALL
        SELECT  'dolor duck' AS name, 12 AS sort_a, 3 AS sort_b
        ) q
ORDER BY
        COALESCE(sort_b, sort_a), sort_a
0 голосов
/ 26 января 2011

Это немного сложно, но можно сделать с помощью UNION. Первое предложение относится к пустым строкам, второе предложение относится к другим:

select name
     , sort_a
     , sort_a as sort_b
  from myTable
 where sort_b is null
 UNION ALL
select name
     , sort_a
     , sort_b
  from myTable
 where sort_b is NOT null
 order by 3,2

Обратите внимание, что в запросе UNION вы сортируете, используя номера столбцов вместо имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...