2015-10-04 75 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