4

我有一个向用户显示选项列表的 PHP 应用程序。该列表是从针对 SQL 2000 的简单查询生成的。我想做的是在列表顶部有一个特定选项,然后将其余选项按字母顺序排序。

例如,以下是按字母顺序排序的选项:

Calgary  
Edmonton  
Halifax  
Montreal  
Toronto  

我希望列表更像这样:

**Montreal**  
Calgary  
Edmonton  
Halifax  
Toronto  

有没有办法可以使用单个查询来做到这一点?还是我坚持运行查询两次并附加结果?

4

5 回答 5

6
SELECT name
FROM locations
ORDER BY
    CASE
        WHEN name = 'Montreal' 
        THEN 0
        ELSE 1
    END, name
于 2008-09-17T13:11:00.533 回答
4
SELECT name FROM options ORDER BY name = "Montreal", name;

注意:这适用于 MySQL,而不是像 OP 要求的 SQL 2000。

于 2008-09-17T13:07:04.520 回答
0
create table Places (
    add Name varchar(30),
    add Priority bit
)

select   Name
from     Places
order by Priority desc,
         Name
于 2008-09-17T13:08:26.793 回答
0

我在一个充满案例报告的网站上遇到了类似的问题。我希望已知受害者姓名的案例报告排在最前面,因为它们更引人注目。相反,我希望所有 John Doe 案件都在底部。由于这也涉及到人名,所以我也遇到了名字/姓氏排序问题。我不想将它分成两个名称字段,因为有些情况根本不是人。

我的解决方案:

我有一个显示的“名称”字段。我还有一个用于所有查询但从未显示的“NameSorted”字段。我的输入 UI 负责将输入到排序字段的“LAST,FIRST”自动转换为显示版本。

最后,为了“装配”排序,我只需在排序字段的开头放置适当的字符。因为我想让东西在最后出来,所以我把“zzz”放在开头。要在顶部排序,您可以输入“!” 一开始。同样,您的编辑 UI 可以为您解决这个问题。

是的,我承认它有点俗气,但它确实有效。对我来说,一个优势是我必须在不同的地方进行更复杂的查询来生成页面而不是 RSS 等,而且我不必记住一个复杂的表达式来正确排序,它总是按“NameSorted “ 场地。

单击我的个人资料以查看生成的网站。

于 2008-09-17T13:16:38.350 回答
0

我结束了这个

SELECT name
FROM locations
LEFT JOIN (VALUES ('Toronto', 1), ('Montreal', 2)) city (name, rank)
    ON locations.name = city.name
ORDER BY city.rank, locations.name;

对于这个例子来说,这可能是多余的,但可以扩展以满足更复杂的需求。

于 2019-11-07T18:49:31.780 回答