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

Тема в разделе "Базы данных", создана пользователем H01mes, 1 дек 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. H01mes

    H01mes В прошлом rkinfo

    Регистр.:
    28 авг 2008
    Сообщения:
    129
    Симпатии:
    27
    как сделать поиск по разным ячейкам но чтоб поисковая фраза при этом считалась цельной т.е. запрос к примеру "ООО ПРАВО"
    где ООО находится в ячейке 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'] это наша поисковая фраза

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

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

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Если последовательность ввода будет соблюдаться, то

    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 для начинающих"
     
    rkinfo нравится это.
  3. H01mes

    H01mes В прошлом rkinfo

    Регистр.:
    28 авг 2008
    Сообщения:
    129
    Симпатии:
    27
    да запросто мы разбили на отдельные слова а вот при выводе чтоб релевантность была т.е. если полная комбинация слов найдена например в ячейке 222 а также комбинация слов найденна в двух ячейках 111 = 222 чтоб этот запрос считался более приоритетным чем первый как реализовать такую приоритетность вывода?
     
  4. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Подожди, так в запросе может быть больше двух слов? Просто с фразы:
    создалось впечатление, что в одном поле содержатся виды организационно-правовых форм, а в другом название... Наверное больше спать нужно :)

    Сколько строк в таблице и сколько в среднем текста в полях, по которым ты ищешь?
     
  5. H01mes

    H01mes В прошлом rkinfo

    Регистр.:
    28 авг 2008
    Сообщения:
    129
    Симпатии:
    27
    да конечно например "АНО Союз промышленников и предпринимателей"

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

    Simpson

    Регистр.:
    22 июл 2007
    Сообщения:
    373
    Симпатии:
    36
    Думаю нужно копать в сторону функции REGEXP.
    Нечто вроде:
    SELECT id, 222 FROM ".$basepref."_catorg
    WHERE 222 REGEXP '[$seavars['word1']].*[$seavars['word2']].*[$seavars['word3']].*';

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

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

    lozano Писатель

    Регистр.:
    4 янв 2008
    Сообщения:
    9
    Симпатии:
    4
    http://www.mysql.ru/docs/man/Fulltext_Search.html

    но я бы сделал при поиске выбор организационно-правовой формы из списка - их ведь не так много получится
     
    rkinfo нравится это.
  8. elcaste

    elcaste

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

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

    Ищешь в запросе форму собственности по списку, переводишь, если нужно, в тот формат в котором она находится в БД. Пусть это будет $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"); 
    Правда это будет точный поиск.
     
  9. Denis5

    Denis5 Постоялец

    Регистр.:
    2 сен 2008
    Сообщения:
    98
    Симпатии:
    23
    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, и если я правильно понял что те нужно.
     
    rkinfo нравится это.
  10. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Ну разве что поставить, если есть возможность:
    [mysqld]
    ft_min_word_len=2
     
Статус темы:
Закрыта.