首先按特定字段值排序

时间:2018-09-26 15:24:19

标签: mysql sql-order-by

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

我如何不按特定值而是按“喜欢”值(如果有)对结果进行排序?

示例:

这是桌子1

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

我想按DESCRIPTION like 'Wo%'的顺序订购,

在“伪代码”中,类似于:

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

预期结果是:

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

此代码无法正常工作,因为value1, ..., valueN应该是准确的字段值。

3 个答案:

答案 0 :(得分:1)

  • 您可以根据Select的要求,在LIKE%%子句中计算排名。您可以使用If()函数或Case When语句。
  • 对于单个LIKE%%要求,可以使用If(),否则可以使用Case When
  • 现在,您可以按该排名对结果进行排序。
  • 注意: As answered通过 @ spencer7593 ,您可以在CASE WHEN子句本身中执行相同的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

答案 1 :(得分:0)

我们可以在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,那么在NULL值为descrption的情况下,我们的行为会略有不同。

如果我们不喜欢ORDER BY子句中的裸露的“ foo LIKE bar”表达式,可以将其包装在MySQL函数中,以使其对将来的读者更加清楚,

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

同样,这里的关键是我们可以在ORDER BY子句中使用 expressions 。为了进行测试,我们可以在SELECT列表中包含相同的表达式,因此我们可以“查看”(在返回的结果中)这些表达式的计算结果。但是请注意,并不需要ORDER BY中的表达式必须出现在SELECT列表中。

答案 2 :(得分:-1)

尝试

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