我知道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
应该是准确的字段值。
答案 0 :(得分:1)
Select
的要求,在LIKE%%
子句中计算排名。您可以使用If()函数或Case When语句。LIKE%%
要求,可以使用If(),否则可以使用Case When。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.