按特定字段值排序,如first

olmpazwi  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(376)

我知道 ORDER BY FIELD(fieldname, value1, value2, ..., valueN) 功能。
我怎么能不按特定值,而是按“相似”值(如果有的话)排序结果?
例子:
这是table

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

我想点菜 DESCRIPTION like 'Wo%' ,比其他的
在“伪代码”中,类似于:

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

预期结果是:

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

此代码不起作用 value1, ..., valueN 应为精确的字段值。

cbjzeqam

cbjzeqam1#

我们可以在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 将最后排序,满足条件的值将首先排序(因为我们已经指定 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 .
如果我们不喜欢“foo-like-bar”在 ORDER BY 子句中,我们可以将其 Package 在一个mysql函数中,以使将来的读者更加清楚,

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

同样,这里的关键是我们可以在 ORDER BY 条款。对于测试,我们可以在select列表中包含相同的表达式,这样我们就可以“看到”(在返回的结果中)这些表达式的计算结果。但是请注意,没有要求 ORDER BY 必须出现在 SELECT 列表。

huwehgph

huwehgph2#

试试看

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

kpbpu0083#

你可以计算排名 Select 条款,根据您的要求 LIKE%% 要求。可以使用if()函数或case-when语句。
如果是单 LIKE%% 需求,if()可以使用,else case when。
现在,你可以根据排名排序结果。
note:as answered 通过@spencer7593,你也可以这样做 CASE WHENORDER 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

相关问题