Соответствие ключевого слова ORDER BY MySQL - PullRequest
3 голосов
/ 25 января 2011

У меня есть такая таблица:

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 ]

1 голос
/ 25 января 2011

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

select * from test order by IF(instr(name, 'toc'), instr(name, 'toc'), 65535) desc;
1 голос
/ 25 января 2011

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

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 голосов
/ 26 января 2011

Если ваша вещь лаконична:

select *
from test
order by
    instr(name, 'tac') = 0,
    instr(name, 'tac') desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...