MySQL ORDER BY关键字匹配

时间:2011-01-25 19:34:34

标签: sql mysql search

我有一张这样的表:

mysql> select * from test;
+-------------+
| name        |
+-------------+
| one         |
| two         |
| three       |
| tic tac toe |
| tac toe tic |
+-------------+
5 rows in set (0.00 sec)

我想查询它,以便我获得所有行,但首先匹配某个关键字的那些行。这是我到目前为止所得到的:

mysql> select * from test order by instr(name, 'tac') desc;
+-------------+
| name        |
+-------------+
| tic tac toe |
| tac toe tic |
| one         |
| two         |
| three       |
+-------------+
5 rows in set (0.01 sec)

唯一的问题是我更喜欢按照关键字出现的字段开头的距离来排序匹配的行。由于instr()在没有匹配的情况下返回0,所以当我在ORDER BY INSTR(name,'tac')ASC时,首先出现不匹配的行。我无法找到解决方法。

我需要MySQL像这样订购

1
2
3
4
0
0
0

或者我需要instr()来返回NULL而不是0。

3 个答案:

答案 0 :(得分:1)

您需要按2列排序,第一列表示是否进行了匹配(将0设置为最低点)

select *
from test
order by
    CASE WHEN instr(name, 'tac') = 0 then 1 else 0 end,
    instr(name, 'tac') desc;

关于使用NULL的注释,它们位于查询的顶部,因此将0转换为null将不起作用。

select a
from (select 1 as a union all select null) b
order by a

结果

(NULL)
1

答案 1 :(得分:1)

使用IF,您将能够执行您想要的操作:在没有匹配项时返回不同于零的值:

select * from test order by IF(instr(name, 'toc'), instr(name, 'toc'), 65535) desc;

答案 2 :(得分:0)

如果你的确是个傻瓜:

select *
from test
order by
    instr(name, 'tac') = 0,
    instr(name, 'tac') desc;