mySQL按特定值排序&然后DESC


mySQL order by certain values & then DESC?

假设我有一个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,您可以将您的答案读入数组,在顶部弹出您想要的元素,将它们存储在临时数组中。按字母顺序对原始数组排序,然后在临时数组前加上。