Как построить запрос поиска по разным ячейкам одной таблицы

Статус
В этой теме нельзя размещать новые ответы.

H01mes

В прошлом rkinfo
Регистрация
28 Авг 2008
Сообщения
138
Реакции
26
как сделать поиск по разным ячейкам но чтоб поисковая фраза при этом считалась цельной т.е. запрос к примеру "ООО ПРАВО"
где ООО находится в ячейке 111 а ПРАВО в ячейке 222

делаю так
PHP:
$inq = $db->query("SELECT id,111,222 FROM ".$basepref."_catorg
                   WHERE (111 LIKE '%".$seavars['word']."%'
                   OR 222 LIKE '%".$seavars['word']."%')
                   ORDER BY id DESC LIMIT 10");
где $seavars['word'] это наша поисковая фраза

при этом запросе получаю нулевой результат а если по отдельности понятно что результат есть.

собственно нужна функция разбивающая запрос на отдельные элементы. полагаю так.
 
Если последовательность ввода будет соблюдаться, то

PHP:
$words = explode(' ', $seavars['word']);
$inq = $db->query("SELECT id,111,222 FROM ".$basepref."_catorg 
                   WHERE (111 LIKE '%".trim($words[0])."%' 
                   OR 222 LIKE '%".trim($words[1])."%') 
                   ORDER BY id DESC LIMIT 10");

PS: А вообще, ты ошибся разделом --> "PHP для начинающих"
 
да запросто мы разбили на отдельные слова а вот при выводе чтоб релевантность была т.е. если полная комбинация слов найдена например в ячейке 222 а также комбинация слов найденна в двух ячейках 111 = 222 чтоб этот запрос считался более приоритетным чем первый как реализовать такую приоритетность вывода?
 
да запросто мы разбили на отдельные слова а вот при выводе чтоб релевантность была т.е. если полная комбинация слов найдена например в ячейке 222 а также комбинация слов найденна в двух ячейках 111 = 222 чтоб этот запрос считался более приоритетным чем первый как реализовать такую приоритетность вывода?

Подожди, так в запросе может быть больше двух слов? Просто с фразы:
запрос к примеру "ООО ПРАВО"
где ООО находится в ячейке 111 а ПРАВО в ячейке 222
создалось впечатление, что в одном поле содержатся виды организационно-правовых форм, а в другом название... Наверное больше спать нужно :)

Сколько строк в таблице и сколько в среднем текста в полях, по которым ты ищешь?
 
Подожди, так в запросе может быть больше двух слов? Просто с фразы:
да конечно например "АНО Союз промышленников и предпринимателей"

создалось впечатление, что в одном поле содержатся виды организационно-правовых форм, а в другом название... Наверное больше спать нужно :)

именно так в первом (111) организационно правовая форма организации а во втором (222) ее название плюс еще осложняется поиск тем что организационно правовая форма у некоторых предприятий написанна полностью т.е. "Обшество с ограниченной ответственностью"
 
Думаю нужно копать в сторону функции REGEXP.
Нечто вроде:
SELECT id, 222 FROM ".$basepref."_catorg
WHERE 222 REGEXP '[$seavars['word1']].*[$seavars['word2']].*[$seavars['word3']].*';

предварительно разбить строку запроса на слова.

P.S. в регекспах я не очень...
 


но я бы сделал при поиске выбор организационно-правовой формы из списка - их ведь не так много получится
 
в первом (111) организационно правовая форма организации а во втором (222) ее название плюс еще осложняется поиск тем что организационно правовая форма у некоторых предприятий написанна полностью т.е. "Обшество с ограниченной ответственностью"

Чтобы было меньше головной боли наведи порядок в поле с формами собственности. Т.е. переименуй все "Обшество с ограниченной ответственностью" в ООО, "Акционерное общество" в АО и т.д.

Потом при каждом запросе готовишь запрос в базу по алгоритму:

Ищешь в запросе форму собственности по списку, переводишь, если нужно, в тот формат в котором она находится в БД. Пусть это будет $form.
Удаляешь ее из запроса и устанавливаешь между словами по одному пробелу(в БД должно быть то же самое). Пусть название предприятия будет $name;

Потом делаешь запрос:
PHP:
$inq = $db->query("SELECT id,111,222 FROM ".basepref."_catorg WHERE 111 = '".$form."'  
                   AND 222 = '".$name."' ORDER BY id DESC LIMIT 10");

Правда это будет точный поиск.
 
PHP:
$terms=explode(" ","ООО ПРАВО");
foreach ($terms as $trm) { 
$term.="$trm ";
}
$term=rtrim($term);
$query = "SELECT id,111,222, ( (1.5 * (MATCH(111) AGAINST ('$term' IN BOOLEAN MODE))) + (1.2 * (MATCH(222) AGAINST ('$term' IN BOOLEAN MODE))) ) AS relevance from ".$basepref."_catorg  WHERE ( MATCH(111,222) AGAINST ('$term' IN BOOLEAN MODE) ) HAVING relevance > 0 ORDER BY relevance DESC LIMIT 10";

1.5,1.2-пример, сам подставь какие нужно. Если таблица конечно не innodb, и если я правильно понял что те нужно.
 
PHP:
$terms=explode(" ","ООО ПРАВО");
foreach ($terms as $trm) { 
$term.="$trm ";
}
$term=rtrim($term);
$query = "SELECT id,111,222, ( (1.5 * (MATCH(111) AGAINST ('$term' IN BOOLEAN MODE))) + (1.2 * (MATCH(222) AGAINST ('$term' IN BOOLEAN MODE))) ) AS relevance from ".$basepref."_catorg  WHERE ( MATCH(111,222) AGAINST ('$term' IN BOOLEAN MODE) ) HAVING relevance > 0 ORDER BY relevance DESC LIMIT 10";

1.5,1.2-пример, сам подставь какие нужно. Если таблица конечно не innodb, и если я правильно понял что те нужно.
Ну разве что поставить, если есть возможность:
[mysqld]
ft_min_word_len=2
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху