Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сложный запрос к MySQL
 
 автор: Iskatel   (18.11.2004 в 08:23)   письмо автору
 
 

Подскажите пожалуйста как грамотно составить запрос к MySQL.

Имеется таблица MUZ_TAB
В ней некоторое количество полей из которых для поиска например важны: N1_MUZ и N2_MUZ
В этих полях информация представлена в виде нескольких слов, например:

N1_MUZ: Max Dron
N2_MUZ: ARTUR HELP

(т,е, записи по 2-3 слова и смешанным регистром)

Надо чтобы при вводе запроса выдавались все записи где есть искомое слово или словосочетание.
Например, при вводе слова MAX выдавались все записи где встречается это слово независимо от регистра и количества слов в поле.
Слово должно искаться в обоих полях таблицы.

Ввожу MAX
Получаю:
Max * / * *
* MaX / * *
* * / * MAX


Гм. Еще важная деталь, если первые три символа совпадают слово считается найденным
например, Мах = Maxim (но только с первой буквы- Max не равен MMax)

Ох и намучился я уже с этим запросом! Никак не могу найти верный способ.

-----
P.S: Когда набрел случайно на форум был приятно удивлен его информативностью и тем что грамотно отвечают на все вопросы даже порой совсем детские.
За полчаса нашел ответы на вопросы, которые мог искать в сети очень долго.
Очень хорошо, что такой форум есть. Обязательно поставлю на него ссылку в свой сайт. :)

   
 
 автор: cheops   (18.11.2004 в 11:39)   письмо автору
 
   для: Iskatel   (18.11.2004 в 08:23)
 

Можно следовать двумя путями,
1) либо воспользоваться полнотекстовым поиском по полям типа TEXT проиндексированных индексом FULLTEXT
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=148
2) либо отталкиваться от операторов LIKE и REGEXP
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=514

PS Сейчас нужно выбрать по какому пути идти в составлении запроса. Вы к чему больше склоняетесь?
PPS Спасибо за добрый отзыв :)))

   
 
 автор: cheops   (18.11.2004 в 16:14)   письмо автору
 
   для: cheops   (18.11.2004 в 11:39)
 

Правда в первом случае минимальное число символов должно быть не меньше 4 символов (MySQL по умолчанию скомпилировано с этим значением) - это приемлемо или нет?

   
 
 автор: Iskatel   (18.11.2004 в 16:20)   письмо автору
 
   для: cheops   (18.11.2004 в 11:39)
 

Я склоняюсь ко второму способу. Именно в этом направлении я пытался сделать запрос.
Когда мучился, некоторые условия этой задачи получались по отдельности но все вместе так и не пошло. Возможно не хватало именно совета хорошо разбирающегося в этом товарища.
Например я переводил искомое к одному регистру, потом переводил все в аски код и сравнивал с LIKE. Чувствую что это не правильно.
По первому слову в поле (если оно одно) вроде все находилось но если искомое в поле стоит вторым словом и если оно содержит больше букв чем запрос начинались жуткие глюки. :^(

   
 
 автор: cheops   (18.11.2004 в 16:29)   письмо автору
 
   для: Iskatel   (18.11.2004 в 16:20)
 

На счёт регистра вы зря беспокоитесь MySQL не различает регистр при сравнении (если поле производное от TEXT и не имеет атрибут BINARY).

   
 
 автор: cheops   (18.11.2004 в 16:27)   письмо автору
 
   для: cheops   (18.11.2004 в 11:39)
 

Хм... скорее всего вам подойдёт следующий запрос
SELECT * FROM MUZ_TAB
WHERE N1_MUZ REGEXP "max*" OR N2_MUZ REGEXP "max*"

   
 
 автор: Iskatel   (18.11.2004 в 23:08)   письмо автору
 
   для: cheops   (18.11.2004 в 16:27)
 

Гм.. получается даже очень простой запрос :-o
Но в нем есть глюки:

Вот мой запрос:

SELECT * FROM tb_nbr WHERE nom REGEXP '$colname_Recordset1*'  OR dop  REGEXP '$colname_Recordset1*' 


дело в том что он ищет на одну букву меньше чем в моей переменной. !?
Например пишу -artu
находит- artur artom artemon...
вместо только -artur

Второй глюк самый важный: находит даже если словосочетание есть в середине слова
пишу -artu
находит -namart... popart...

2. И вот вопрос - можно ли сделать чтобы ответ распологался в последовательности от первостепенного - совпадение в первом поле до второстепеного - совпадение во втором поле,
а если еще лучше что ответ совпал полностью это важнее чем если совпало только по началу слова?

   
 
 автор: cheops   (18.11.2004 в 23:22)   письмо автору
 
   для: Iskatel   (18.11.2004 в 23:08)
 

1) Хм... насчёт усечения символа нужно подумать...
Насчёт второго глюка, я думал, это именно то, что нужно, если необходимо чтобы поиск осуществлялся именно с первого симовола следует исправить запрос на
"SELECT * FROM tb_nbr WHERE nom REGEXP '^".$colname_Recordset1."*'  OR dop  REGEXP '^".$colname_Recordset1."*'"

   
 
 автор: cheops   (19.11.2004 в 00:30)   письмо автору
 
   для: cheops   (18.11.2004 в 23:22)
 

Против усечения должно помочь явное указание класса символов:
"SELECT * FROM tb_nbr WHERE nom REGEXP '^".$colname_Recordset1."[[:alnum:]]*'  OR dop  REGEXP '^".$colname_Recordset1."[[:alnum:]]*'"

   
 
 автор: cheops   (18.11.2004 в 23:29)   письмо автору
 
   для: Iskatel   (18.11.2004 в 23:08)
 

2) Релевантностью запроса и выводом по реливантности можно управлять при полнотекстовом поиске в логическом режиме. Помоему при использовании регулярных выражений никаких средств нет.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования