按特定字段值 LIKE 首先排序

Ordering by specific field value LIKE first

我知道ORDER BY FIELD(fieldname, value1, value2, ..., valueN)函数。

我如何才能不按特定值,而是按 "like" 值(如果有)对结果进行排序?

示例:

这是表 1

--------------------
| ID | DESCRIPTION |
--------------------
| 1  | Hello       |    
| 2  | World       |
--------------------

我想在 DESCRIPTION like 'Wo%' 之前订购,而不是其他

在 "pseudo code" 中,类似于:

SELECT DESCRIPTION 
FROM table1 
ORDER BY FIELD(DESCRIPTION, 'Wo%') DESC 

预期结果是:

----------------
|  DESCRIPTION |
----------------
|  World       |    
|  Hello       |
----------------

此代码无效,因为 value1, ..., valueN 应该是准确的字段值。

  • 您可以根据您的 LIKE%% 要求在 Select 子句中计算排名。您可以使用 If() function or Case When 语句。
  • 在单个 LIKE%% 需求的情况下,If() can be used, else Case When.
  • 现在,您可以按该排名对结果进行排序。
  • 注意: by @spencer7593,你可以在 ORDER BY 子句本身,而不是首先在 Select 子句中显式计算它们。

尝试以下操作:

SELECT DESCRIPTION, IF(DESCRIPTION LIKE '%Wo%', 1, 99999) AS Rank  
FROM table1 
ORDER BY Rank ASC

如果有多个LIKE%%条件,可以使用如下:

SELECT DESCRIPTION, 
       CASE 
         WHEN DESCRIPTION LIKE '%Wo%' THEN 1 
         WHEN DESCRIPTION LIKE '%He%' THEN 2 
         ELSE 99999
       END AS Rank  
FROM table1 
ORDER BY Rank ASC

试一试

SELECT DESCRIPTION 
FROM table1 
Where DESCRIPTION like 'Wo%' 
order by DESCRIPTION.

我们可以在ORDER BY子句中使用表达式,例如:

 SELECT t.description
   FROM table1 t
  ORDER
     BY t.description LIKE 'Wo%' DESC 
      , t.description

表达式 t.description LIKE 'Wo%' 的计算结果为 0、1 或 NULL。 所以 description 的 NULL 值将最后排序,满足条件的值将首先排序(因为我们已经指定 DESC 为降序排序。

更便携、更符合 ANSI 标准的等效项是:

 SELECT t.description
   FROM table1 t
  ORDER
     BY CASE WHEN t.description LIKE 'Wo%' THEN 1 
             WHEN t.description NOT LIKE 'Wo%' THEN 0 
        END DESC
      , t.description

如果我们可以省略第二个 WHEN 并只执行 ELSE 0,这将使我们的行为与 descrption.

的 NULL 值略有不同

如果我们不喜欢 ORDER BY 子句中的裸露 "foo LIKE bar" 表达式,我们可以将其包装在 MySQL 函数中,以便将来更清楚 reader,

 SELECT t.description
   FROM table1 t
  ORDER
     BY IF(t.description LIKE 'Wo%',1,0) DESC
      , t.description

同样,这里的重点是我们可以在ORDER BY子句中使用表达式。为了测试,我们可以在 SELECT 列表中包含相同的表达式,因此我们可以 "see" (在返回的结果中)这些表达式的计算结果。但请注意,并不要求 ORDER BY 中的表达式必须出现在 SELECT 列表中。