ORDER BY单词开头或内场

时间:2012-11-15 14:35:09

标签: mysql sql-order-by

我在mysql-db上有一个ajax-search。示例:搜索我查询的“man”:

SELECT id FROM table WHERE name LIKE '%man%;

我现在想要对结果进行排序,以便按字母顺序从搜索开始所有结果:

man
mankind

之后我想让所有结果按字母顺序宽度搜索INSIDE,如:

iron man
woman

我该怎么做?

3 个答案:

答案 0 :(得分:6)

您可以按字符串中搜索字词的位置排序:

SELECT id 
FROM table 
WHERE name LIKE '%man%'
ORDER BY INSTR(name, 'man'), name

另请参阅:INSTR()LOCATE()

您还可以将表达式更改为仅区分字符串的开头或其他任何位置:

ORDER BY IF(INSTR(name, 'man'), 1, 0)

答案 1 :(得分:2)

您可以使用ORDER BY语句构建CASE以验证子字符串。注意:我在这里使用UPPER()将搜索值和列值转换为大写,用于不区分大小写的匹配。如果您不需要,请移除UPPER()

ORDER BY
  CASE 
    /* Matches the start of the string */
    WHEN UPPER(LEFT(name, 3)) = 'MAN' THEN 1
    /* Doesn't match the end or the start (in the middle) */
    WHEN UPPER(RIGHT(name, 3)) <> 'MAN' THEN 2
    /* Matches the end of the string */
    WHEN UPPER(RIGHT(name, 3)) = 'MAN' THEN 3
    ELSE 4
  END,
  /* Then order by the name column */
  name

此方法应该相当便携,但我更喜欢下面的INSTR()答案。

答案 2 :(得分:1)

试试这个

SELECT id FROM table WHERE name LIKE 'man%';
UNION
SELECT id FROM table WHERE name LIKE '%man%';