2011-01-25 2 views
3

У меня есть таблица вроде этого:MySQL ORDER BY совпадение ключевого слова

 
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 

или мне нужно инстр() возвращать NULL вместо 0.

ответ

1

Вам нужно заказать на 2 колонны, первый один, чтобы указать, является ли матч был сделан (чтобы 0s идти вниз)

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

замечание об использовании NULL, они приходят к верхней части запроса, поэтому он не будет работать для вас, чтобы преобразовать 0 в нуль.

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

Результат

(NULL) 
1 
+0

Это работало perfe Благодарю вас! Я никогда раньше не использовал оператор CASE в MySQL или какой-либо условный SQL-запрос. Я думаю, что это, вероятно, быстрее, чем сортировка результатов в чем-то вроде PHP после запроса. – Kevin

1

С IF вы будете в состоянии сделать то, что вы хотите: возвращает значение, отличное от нуля, когда нет матча:

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

Спасибо за ваш ответ. Я пошел с заявлением, предложенным cyberkiwi, но я уверен, что вы бы хорошо поработали. – Kevin

0

Если succintness это ваш вещь:

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

Итак, я полагаю, что instr (name, 'tac') = 0 будет разрешено либо true, либо false, а false - упорядочиваются при восходящем? – Kevin

+0

действительно (еще 9) –

Смежные вопросы