MySQL group_concat () упорядочение по значениям оператора case

В предложении MySQL group_concat() я пытаюсь упорядочить результирующие значения оператора case. Следующая конфигурация запроса правильно упорядочивает things.name, но не упорядочивает значения «Не для США» или «Неизвестно» в одном контексте.

SELECT 
  things.id
  ,group_concat(DISTINCT 
    CASE
    WHEN things.name <> 'United States' THEN 'Non-US'
    WHEN things.name IS NULL THEN 'Unknown'
    ELSE things.name
    END
  ORDER BY name SEPARATOR ', ')
FROM things
GROUP BY things.id

Я хочу сделать что-то подобное, но это не работает:

SELECT 
  things.id
  ,group_concat(DISTINCT 
    (CASE
    WHEN things.name <> 'United States' THEN 'Non-US'
    WHEN things.name IS NULL THEN 'Unknown'
    ELSE things.name
    END) AS new_name
  ORDER BY new_name SEPARATOR ', ')
FROM things
GROUP BY things.id

Есть ли способ сортировки по "new_name" без использования подзапросов / вложенных запросов?


person s2t2    schedule 08.07.2015    source источник
comment
Если он не принимает псевдоним new_name в ORDER BY, он все равно должен принимать все CASE выражение как GROUP_CONCAT(DISTINCT CASE...END ORDER BY CASE WHEN things.name....END SEPARATOR ', '). Это было бы некрасиво, но попробовать стоит. В противном случае вам, вероятно, понадобится подзапрос, чтобы поместить значение сортировки в настоящий столбец.   -  person Michael Berkowski    schedule 08.07.2015
comment
Подзапрос был бы намного чище, чем мой ответ ниже; хотя группировка по полю id подразумевает, что вам вообще не нужна GROUP_CONCAT ().   -  person Uueerdo    schedule 08.07.2015
comment
поле id в этом примере было добавлено сюда только для иллюстрации (возможно, не лучший выбор). реальный запрос другой.   -  person s2t2    schedule 09.07.2015


Ответы (2)


Этого можно добиться, упорядочив по положению столбца вместо имени столбца.

Для вашего случая ORDER BY 1 должен работать.

SELECT 
  things.id
  ,group_concat(DISTINCT 
    CASE
    WHEN things.name <> 'United States' THEN 'Non-US'
    WHEN things.name IS NULL THEN 'Unknown'
    ELSE things.name
    END
  ORDER BY 1 SEPARATOR ', ')
FROM things
GROUP BY things.id
person Ike Walker    schedule 08.07.2015
comment
Ах, я бы надеялся, что это то, о чем на самом деле упоминается этот бит unsigned_integer в определении синтаксиса руководства. Но в инструкции это не объясняется! Кстати, на самом деле это не позиция столбца, поскольку она не является частью SELECT или таблицы; это просто позиция выражения в списке аргументов GROUP_CONCAT, если это действительно так. - person Doin; 08.12.2015

Переменная сеанса может работать, но я не уверен в порядке оценки в GROUP_CONCAT ():

SELECT 
  things.id
  , group_concat(DISTINCT 
      @new_name := (CASE
        WHEN things.name <> 'United States' THEN 'Non-US'
        WHEN things.name IS NULL THEN 'Unknown'
        ELSE things.name
        END
      ) ORDER BY @new_name SEPARATOR ', ')
FROM things
GROUP BY things.id
;

Если это не сработает, вы можете попробовать выполнить задание в разделе ORDER BY и просто использовать @new_name в pre-ORDER BY.

person Uueerdo    schedule 08.07.2015