MySql выборка с сортировкой по сложным словам

amixen

Новичок
MySql выборка с сортировкой по сложным словам

Приветствую знатоков!
Есть мускульная таблица:
[sql]
CREATE TABLE `test` (
`id` INT NOT NULL AUTO_INCREMENT ,
`f_key` VARCHAR( 20 ) NOT NULL ,
`f_text` TEXT NOT NULL ,
PRIMARY KEY ( `id` ) ,
FULLTEXT (
`f_key`
)
);
[/sql]

Есть такие скажем записи:
[sql]
INSERT INTO `test` VALUES (1, 'asd.qwe', 'blablabla');
INSERT INTO `test` VALUES (2, 'uioqq', 'blablabla');
INSERT INTO `test` VALUES (3, 'asd', 'blablabla');
INSERT INTO `test` VALUES (4, 'qwe.ert', 'blablabla');
INSERT INTO `test` VALUES (5, 'zxc.jkl', 'blablabla');
INSERT INTO `test` VALUES (6, 'aaaaa', 'blablabla');
[/sql]


Мне требуется выбрать данные из таблицы ;) с сортировкой по полю `f_key`... НО что бы все строки где в этом поле встречаются точки шли вверху!

Но MATCH (f_key) AGAINST ('.') не совсем подходит... :( Синтаксис AGAINST не предполагает наличие символов, т.е. не предполагает наличие корней символов...

конструкция вида: [sql]ORDER BY IF (f_key LIKE '%.%', f_key, 10000000000)[/sql]
не даёт результата...
Надо както дать понять [sql]ORDER BY[/sql] что искать надо по точке.
 

Фанат

oncle terrible
Команда форума
мыслишь верно, только лайк, конечно, впихнул очень смешно =)
вместо лайка используй строковые функции, и соритровать надо по двум полям - по ифу и ключу.
 

amixen

Новичок
Да, смешно, действительно ;) сам проникся.

Получилось с LIKE.

[sql]
SELECT f_key LIKE '%.%' AS s
FROM tables
ORDER BY s DESC, f_key
[/sql]

Не знаю правда насчет скорости работы на больших таблицах... Просто для информации хотелось бы знать.

Буду благодарен, если найдется еще решение с строковыми функциями, ато это мне кажется черезчур ресурсоёмким...
 

Фанат

oncle terrible
Команда форума
Буду благодарен, если найдется еще решение с строковыми функциями
оно обязательно найдётся.
если ты предпримешь хоть какие-то шаги в направлении поиска.
к примеру, ознакомишься со списком строковых функций.
 

amixen

Новичок
Автор оригинала: Фанат
оно обязательно найдётся.
если ты предпримешь хоть какие-то шаги в направлении поиска.
к примеру, ознакомишься со списком строковых функций.
Надо было конечно прокомментировать мои поиски... ;)
Ато создалось впечатление, что я просто хочу получить готовое решение...
Комментирую:

я думал сделать с помощью POSITION(substr IN str)

SELECT t.*,
IF(POSITION('.',t.deff_key), 1, 0) AS score
FROM light_deff_field AS t
ORDER BY score, t.deff_key

Но POSITION не понимает, если указать поле а не строку!


SELECT t.*,
SUBSTRING_INDEX(t.deff_key, '.', 1) AS score
FROM light_deff_field AS t
ORDER BY score, t.deff_key

SUBSTRING_INDEX немного не то, т.к. даже в случае когда не находит - возвращает полностью строку...

REGEXP тотже LIKE, только более ресурсоёмкий.

Вот со строковыми я и получил результата... :(
Может где-нибудь я ошибся. тогда поправьте.
 

Фанат

oncle terrible
Команда форума
почему ты решил, что POSITION не понимает, если указать поле а не строку?
И где ты увидел такой синтаксис у POSITION?
 

amixen

Новичок
Автор оригинала: Фанат
почему ты решил, что POSITION не понимает, если указать поле а не строку?
И где ты увидел такой синтаксис у POSITION?
MySql Help 4

http://www.mysql.ru/docs/maryan/index.html#position

integer POSITION(substr string IN str string)

Возвращает позицию первого вхождения подстроки substr в строке str. Возвращает 0, если substr не найдено в строке str. Поддерживает многобайтовые символы.

Примеры:
mysql> select POSITION('bar', 'foobarbar');
-> 4
mysql> select POSITION('xbar', 'foobar');
-> 0
У меня мускуль 4.1.8
Пробовал:
SELECT *,POSITION('.',deff_key) AS score FROM deff_field

Ответ MySQL:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'deff_key) AS score FROM deff_field LIMIT 0, 30' at line 1

Где же я ошибся???
 

Фанат

oncle terrible
Команда форума
как-то там мутно.
попробуй заменить запятую на in
 

amixen

Новичок
О! :)

IN спас таки...

прироста в скорости нет
phpMyAdmin - Запрос занял 0.0019 сек
Т.е. примерно такая же скорость, что и в конструкции LIKE...

Но я уверен, что в большой таблице прирост будет ;)

Думаю конструкция:

SELECT t.*,
IF(POSITION('.' IN t.deff_key), 1, 0) AS score
FROM light_deff_field AS t
ORDER BY score DESC, t.deff_key

будет быстрее, чем:

SELECT t.*,
t.deff_key LIKE '%.%' AS score
FROM light_deff_field AS t
ORDER BY score DESC, t.deff_key

___________________________
Вопрос решел, спасибо Фанат!
Тему можно закрывать...
 
Сверху