题
我有一个 PHP 应用程序,它向用户显示选项列表。该列表是通过针对 SQL 2000 的简单查询生成的。我想做的是在列表顶部有一个特定的选项,然后将其余选项按字母顺序排序。
例如,以下是按字母顺序排序的选项:
Calgary
Edmonton
Halifax
Montreal
Toronto
我希望列表更像是这样的:
**Montreal**
Calgary
Edmonton
Halifax
Toronto
有没有一种方法可以使用单个查询来完成此操作?或者我是否卡住了运行查询两次并附加结果?
解决方案
SELECT name
FROM locations
ORDER BY
CASE
WHEN name = 'Montreal'
THEN 0
ELSE 1
END, name
其他提示
SELECT name FROM options ORDER BY name = "Montreal", name;
笔记:这适用于 MySQL,而不是像 OP 所请求的那样适用于 SQL 2000。
create table Places (
add Name varchar(30),
add Priority bit
)
select Name
from Places
order by Priority desc,
Name
我在一个充满案例报告的网站上遇到了类似的问题。我希望将已知受害者姓名的案件报告排序到顶部,因为它们更引人注目。相反,我希望所有无名氏案件都位于底部。由于这也涉及人名,因此我也遇到了名字/姓氏排序问题。我不想将其分成两个名称字段,因为有些案例根本不是人。
我的解决方案:
我有一个显示的“名称”字段。我还有一个“NameSorted”字段,用于所有查询但从未显示。我的输入 UI 负责将输入到排序字段的“LAST,FIRST”自动转换为显示版本。
最后,为了“操纵”排序,我只需在排序字段的开头放置适当的字符即可。因为我希望内容在最后出现,所以我在开头放了“zzz”。要排序顶部,您可以放入“!”在开始。同样,您的编辑 UI 可以为您处理这个问题。
是的,我承认这有点俗气,但它确实有效。对我来说,一个优点是我必须在不同位置进行更复杂的连接查询来生成页面而不是 RSS 等,而且我不必一直记住复杂的表达式来获得正确的排序,它总是按“NameSorted”排序“ 场地。
单击我的个人资料即可查看生成的网站。
不隶属于 StackOverflow