2

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

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

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

man
mankind

之后,我希望所有结果都按字母顺序排列搜索 INSIDE,例如:

iron man
woman

我怎样才能做到这一点?

4

3 回答 3

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)
于 2012-11-15T14:39:17.767 回答
2

您可以构造您的ORDER BYusingCASE语句来验证子字符串。注意:我在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()下面的答案。

于 2012-11-15T14:38:13.940 回答
1

试试这个

SELECT id FROM table WHERE name LIKE 'man%';
UNION
SELECT id FROM table WHERE name LIKE '%man%';
于 2012-11-15T14:38:38.463 回答