假设我有一个mySQL表,其中有一个名为"name"的字段
该字段每行包含一个名称。
有10行:
Apple
Pear
Banana
Orange
Grapefruit
Pineapple
Peach
Apricot
Grape
Melon
我将如何形成一个查询,所以我从表中选择,我希望细节显示如下:
Peach
Apple
Apricot
... and then everything else is listed by descending order.
基本上,我想在列表的顶部显示一些指定的结果,然后按降序显示其余的结果。
谢谢。
你可以这样做:
select *
from fruit
order by
case name
when 'Peach' then 1
when 'Apple' then 2
when 'Apricot' then 3
else 4
end,
name
可以使用IF()函数对条件进行排序。IF()
的文档说明:
IF(expr1,expr2,expr3)
如果expr1为TRUE (expr1 <> 0 and expr1 <> NULL)则If()返回expr2;否则返回expr3。IF()返回一个数字或字符串值,具体取决于使用它的上下文。
所以你可以用它来对顶部的特定元素进行排序,像这样:
SELECT *
FROM fruit
ORDER BY
IF(name = 'Peach', 0, 1),
IF(name = 'Apple', 0, 1),
IF(name = 'Apricot', 0, 1),
name DESC
这是一系列顺序,第一个具有最高优先级。所以如果name='Peach'
,它的值是0,其他的值都是1。由于在默认的ASC顺序中,0位于1之前,这确保了"Peach"将位于列表的顶部。该系列中的第二个排序指定了如何打破第一个排序的平局。在这种情况下,除'Peach'外的所有元素在第一个排序中与值'1'并列。在这种情况下,"Apple"被推到了并列列表的顶部,而实际上它在总列表中是第二位。等等……到最后一个'name DESC'
正如另一个答案所指出的,CASE()是一系列IF()
s的替代方案:
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
第一个版本返回value=compare_value的结果。的第二个版本返回第一个条件的结果,即真实的。如果没有匹配的结果值,则ELSE后的结果为如果没有ELSE部分,则返回NULL。
由于您使用的是php,您可以将您的答案读入数组,在顶部弹出您想要的元素,将它们存储在临时数组中。按字母顺序对原始数组排序,然后在临时数组前加上。