2015-10-04 73 views
1

問題#14 SQLZoo 爲表 諾貝爾(年,主題,獲獎者) 竟把 「顯示1984年的獲獎者和主題主題和獲獎者的名字排列,但名單化學與物理最後一次。」如何在特定序列中列出mysql查詢結果?

我的解決辦法是

SELECT winner, subject 
    FROM nobel 
WHERE yr=1984 
ORDER BY subject,winner 

但它不會在最後列出化學和物理。 有沒有辦法做到這一點? 以及如何按特定順序排序字段?

回答

1

使用可以使用CASE

SELECT winner, subject 
FROM nobel 
WHERE yr=1984 
ORDER BY 
CASE 
    WHEN subject IN ('Physics','Chemistry') THEN 1 
    ELSE 0 
END ASC, 
subject, 
winner 

編輯:

這是初級相同Gordon Linoff Solution,但是如果使用多個規則需要被擴展到另一對象。 IN只允許2種方式:false/true。

ORDER BY 
CASE 
    WHEN subject IN ('Physics','Chemistry') THEN 2 
    WHEN subject IN ('Medicine','Literature') THEN 1 
    ELSE 0 
END ASC, 
subject, 
winner 
1

您可以將其他密鑰添加到order by。對於此特定目的:

order by (subject in ('Chemistry', 'Physics')), 
     subject, winner 

第一個條件是一個布爾表達式,其值爲1(對於true)或0(對於false)。因此,這些錯誤出現在trues之前。

+0

但是我們如何確保假trues之前出現?我們不應該在(「化學」,「物理學」)中使用主題 – dshri

+0

@SHRIKANTDANGI。 。 。這就是這個'order by'所做的。 –

0
select subject, winner,yr 
from nobel 
where yr=1984 
order by subject in ('Chemistry','Physics'),subject,winner 
2
SELECT winner, subject 
FROM nobel 
WHERE yr = 1984 
ORDER BY subject IN ('Chemistry', 'Physics'), subject, winner 
0
SELECT winner, subject 
    FROM nobel 
WHERE yr=1984 
ORDER BY 
    case when subject IN ('Physics','Chemistry') then 0 
     ELSE 1 
END desc,subject,winner