2013-03-31 4 views
1

Учитывая следующий запрос:SQL Specific Заказать

SELECT DISTINCT n.iswinner, i.name 
    FROM nominees n, institutions i 
    WHERE n.iid = i.iid and n.filmname = '127 Hours' 
    ORDER BY name 

Я получаю результат:

iswinner name 

NULL academy awards 
NULL baftas 
NULL critics' choice awards 
NULL golden globes 
NULL screen actors guild 
NULL writers guild of america 

Я пытаюсь выяснить, если можно заказать этот вывод в более конкретной форме. Приказ, который я ищу, - это перечислить первые «награды академии», затем «золотые глобусы», а затем все, что угодно с «гильдией» от его имени, и, наконец, все остальное в алфавитном порядке. И поэтому выход я ищу больше вдоль линий этого:

iswinner name 

NULL academy awards 
NULL golden globes 
NULL screen actors guild 
NULL writers guild of america 
NULL bafta 
NULL critics' choice awards 

Есть ли способ сделать такую ​​вещь? Я считаю, что я должен использовать что-то вроде CASE, но я не мог понять, что это правильный синтаксис. Спасибо за любую помощь.

+0

Это вы можете получить близко: http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_field –

+0

Или другой «словарь», чтобы сделать его более гибким и упорядочить по его ID – mlt

+1

@joeframbach: PostgreSQL! = MySQL и 'field' зависят от MySQL. –

ответ

3

Да, есть способ сделать что-то подобное и точно так же, как вы думали, вы можете сделать это с помощью оператора CASE. Что-то вроде следующего должен сделать трюк:

SELECT 
    DISTINCT n.iswinner, 
    i.name, 
    CASE 
     WHEN i.name = 'academy awards' THEN 1 
     WHEN i.name = 'golden globes' THEN 2 
     WHEN i.name like '%guild%' THEN 3 
     ELSE 4 
    END AS Order 
FROM nominees n, institutions i 
WHERE n.iid = i.iid and n.filmname = '127 Hours' 
ORDER BY 
    Order, 
    i.name 

Таким образом, чтобы дать вам немного больше информации о том, что здесь делается. В предложении ORDER мы заказываем оператор CASE. В основном, исходя из поля i.name, мы назначаем целое число для упорядочивания. наградам академии присваивается 1, золотым глобусам присваивается 2, всем, что содержит «гильдию», присваивается 3, а все остальное назначается 4. Поэтому мы сначала заказываем этот оператор CASE (который дает конкретный заказ, который вы хотите), а затем заказываете поле имени, которое удовлетворит ваше второе требование о заказе чего-либо еще по имени (которое мы ранее присвоили значение 4 в инструкции CASE для заказа).

Надеюсь, это имеет смысл для вас.

же запрос с использованием GROUP BY, а не DISTINCT:

SELECT 
    n.iswinner, 
    i.name 
FROM nominees n, institutions i 
WHERE n.iid = i.iid and n.filmname = '127 Hours' 
GROUP BY 
    n.iswinner, 
    i.isname 
ORDER BY 
    CASE 
     WHEN i.name = 'academy awards' THEN 1 
     WHEN i.name = 'golden globes' THEN 2 
     WHEN i.name like '%guild%' THEN 3 
     ELSE 4 
    END, 
    i.name 
+0

Объяснение в полной мере благодарю вас. Однако при попытке реализовать это я получаю следующую ошибку: «для SELECT DISTINCT, ORDER BY выражения должны появляться в списке выбора» –

+0

Похоже, эта ошибка говорит о том, что вы должны включить все столбцы в ORDER BY в запрос SELECT при использовании ключевого слова DISTINCT. Попробуйте добавить оператор CASE в качестве столбца в предложении SELECT. Я буду обновлять ответ, чтобы отразить это. –

+0

Хм, конечно, похоже, исправляет проблему, но добавляет лишний столбец к моей таблице, есть ли вообще избежать этого? Помимо просто сделать его подзапросом и выбрать из этого. –

3
order by 
     case 
     when name = 'academy awards' then 1 
     when name = 'golden globes' then 2 
     when name like '%guild%' then 3 
     else 4 
     end 
,  name 
+0

Для третьего и четвертого случаев они будут перечислены также в алфавитном порядке? Если это так, похоже, именно то, что я ищу. –

1

Нет необходимости в п case. SQL Fiddle

select * 
from (
    select distinct n.iswinner, i.name 
    from nominees n, institutions i 
    where n.iid = i.iid and n.filmname = '127 Hours' 
) s 
order by 
    name != 'academy awards', 
    name != 'golden globes', 
    name not like '%guild%', 
    name 

false заказы до true

Смежные вопросы