Как сортировать по LIKE='...' и LIKE=%...%

12
lutskboy
На сайте с 22.11.2013
Offline
173
731

Приветствую

Такая значит задача

Есть таблица

id|number

1|451236

2|123

3|123456

4|7893

5|65123

6|908761

7|123

И я делаю запрос на поиск 123

SELECT * FROM table WHERE number LIKE='123' OR number LIKE=%123%

Мне вывело результат

Подскажите как его отсортировать сначала по LIKE='123' а потом по LIKE=%123%

то есть мне сначала нужны те записи в которых number=123

а потом где присутствует 123

Jor
На сайте с 23.06.2012
Offline
42
Jor
#1

SELECT * FROM table

WHERE `number` LIKE '%123%'
ORDER BY `number`
C
На сайте с 26.10.2013
Offline
54
#2
Jor:
SELECT * FROM table
WHERE `number` LIKE '%123%'
ORDER BY `number`

теперь представьте, что будет с вашим запросом, если ищем 234 по этим данным

1234

2345

Услуги по парсингу данных (/ru/forum/939826), единоразовый и регулярный сбор данных. Любые объемы. Скрипты на PHP, создание и доработка, решение проблем с сайтами Пишите в личные сообщения или скайп
Jor
На сайте с 23.06.2012
Offline
42
Jor
#3
colorito:
теперь представьте, что будет с вашим запросом, если ищем 234 по этим данным

1234
2345

Первыми будут соответствие 234, а дальше вхождения:

234

1234

2345

astraliens
На сайте с 25.09.2009
Offline
54
#4

используйте find_in_set для подобных вещей

ASTRALiENS - разработка сайтов (http://astraliens.net)
Петр Елагин
На сайте с 21.03.2007
Offline
197
#5



create table tedd(id serial, number varchar(1024));
insert into tedd(number) values(random());
insert into tedd(number) values(random());
insert into tedd(number) values(random());
insert into tedd(number) values(random());
insert into tedd(number) values(random());
insert into tedd(number) values(random());
insert into tedd(number) values(random());
insert into tedd(number) values(random());
insert into tedd(number) values(random());

update tedd set number = number::numeric* 100

select * from tedd

Результат:



1 76.490525575354695300
2 14.238189347088336900
3 24.292673449963331200
4 14.369358867406845100
5 39.690781291574239700
6 86.748498305678367600
7 24.838898656889796300
8 95.582335488870739900
9 96.880081947892904300
10 80.222946405410766600
11 40.204850537702441200
12 67.718303948640823400
13 37.42523677647113800
14 38.427415490150451700
15 21.604739502072334300
16 24.462099187076091800
17 46.75378999672830100
18 38.994055241346359300
19 55.640969797968864400
20 70.349492551758885400
21 69.23343343660235400
22 3.8507518824189901400
23 85.684194741770625100
24 19.929633196443319300
25 88.25013120658695700


select *, (position('55' in number)) as srt from tedd where number like('%55%') order by srt

Результат:



19 55.640969797968864400 1
18 38.994055241346359300 8
1 76.490525575354695300 9
20 70.349492551758885400 10

Немного туповато, но есть результат

Я в таких вопросах всегда спрашиваю - а зачем Вам это?

Может есть решение более элегантное

насчет LIKE='123' я бы вообще бы подумал =) так как лайк очень затратный всегда был =)

C
На сайте с 26.10.2013
Offline
54
#6
Jor:
Первыми будут соответствие 234, а дальше вхождения:

234
1234
2345

А нет в таблице значения 234. Есть всего две строки 1234 и 2345

Соответственно запрос

SELECT * FROM table

WHERE `number` LIKE '%234%'
ORDER BY `number`

вернет

1234

2345

потому как ORDER BY `number`

lutskboy
На сайте с 22.11.2013
Offline
173
#7
astraliens:
используйте find_in_set для подобных вещей

Может подскажите как?

Joker-jar
На сайте с 26.08.2010
Offline
154
#8

Можно в выборку добавить что-то типа If(number = 234, 0, 1) AS srt и впоследствии сортировать и по srt и по number.

---------- Добавлено 24.01.2016 в 01:10 ----------

То есть, примерно так:

SELECT *, If(number = '234', 0, 1) AS srt FROM table WHERE number LIKE '%123%' ORDER BY srt, number;

astraliens
На сайте с 25.09.2009
Offline
54
#9
lutskboy:
Может подскажите как?

SELECT * FROM table WHERE number = "123" OR number LIKE="%123%" order by find_in_set( number, "123" ) 
S
На сайте с 20.04.2004
Offline
145
sss
#10

Такой костылек?

SELECT id, number, (number LIKE '123%')*10+(number LIKE '123')*100 as ord FROM test WHERE number LIKE '%123%' order by ord desc;

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий