как реализовать сложный поиск по базе данных MySQL

Тема в разделе "Как сделать...", создана пользователем sympler, 25 авг 2010.

Статус темы:
Закрыта.
  1. sympler

    sympler Постоялец

    Регистр.:
    24 окт 2008
    Сообщения:
    131
    Симпатии:
    6
    есть таблица ARTICLES

    id site text
    1 3 кино аватар начал показ в...
    2 8 кино аватар открыт..
    3 6 кино термирнатор
    4 2 кино аватар 2 выйдет в свет...
    5 2 кино аватар 3 выйдет в свет...
    6 2 еще текст 2
    7 6 кино титаник

    нужно реализовать сложный поиск:
    сначала идет поиск по записям LIKE (%фраза1%) потом ищем записи по записям LIKE (%фраза2%), в итоговой выдаче уникальным должен быть site и id статей.

    пример: фраза1 = кино аватар, фраза 2 = кино.
    результат поиска должен быть сначала id где есть фраза1, а потом где есть фраза2, а потом уникализовать выдачу по site и id

    в итоге получится:

    id site text
    1 3 кино аватар начал показ в...
    2 8 кино аватар открыт..
    4 2 кино аватар 2 выйдет в свет...
    3 6 кино термирнатор

    ушли 5, 6 и 7 записи,
    5-я и 7-я как неуникальные по site, а в 6-ой не было ни фраза1, ни фраза2.
    по сортировке 4-ая первее идет, потомучто в ней совпадение по фраза1, а в 3-ей записи совпадение по фраза2


    можно ли реализовать это за один sql запрос к базе данных?
     
  2. McLay

    McLay Постоялец

    Регистр.:
    20 май 2008
    Сообщения:
    71
    Симпатии:
    15
    уникальность всеже похоже не по site-id, а просто по site
     
    sympler нравится это.
  3. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    Код:
    select distinct distinct site, text from table 
    where text like ('%text1%') or text like ('%text2%') 
    order by site
    id в вашме случае просто сквозной идентификатор, по нему нет смысла ограничений ставить, он и так выдает уникальные записи
     
    sympler нравится это.
  4. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    Похоже имелось ввиду что записи следуют так: сначала N строк с "фраза1" а потом M строк с "фраза2" Поэтому запрос должен быть с UNION, иначе смешаются типы фраз:
    Код:
    SELECT distinct site,id, ... FROM ??? WHERE text like ('%text1%')
    UNION
    SELECT null,null...//null столько раз сколько столбцов извлекаются из таблицы
    UNION
    SELECT distinct site,id, ... FROM ??? WHERE text like ('%text2%')
    
    и обработчик на PHP
    PHP:
    $text=text1;
    while(
    $row=mysql_fetchassoc(....)){
     if(!
    $row['id']){
       
    text=$text2//2-й юнион из пустых записей служит как разделитель между 1 и 2 наборами 
       
    continue;
     }
     if(!isset(
    $data[$row['id'])){ //в 1-м наборе id будут уники,поэтому услоивие выполнится всегда,Ю а из в-2-го проверяем нет ли уже такого ИД от 1-го набора
       
    $data[$row['id']=$row;
     }
    }
    На выходе будет у тебя нужный $data.
     
    sympler нравится это.
  5. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    да не, я думаю тут как раз надо смешивать, ТС это же сео?
     
    sympler нравится это.
  6. sympler

    sympler Постоялец

    Регистр.:
    24 окт 2008
    Сообщения:
    131
    Симпатии:
    6
    спасибо всем, разобрался сам.
    вот мое решение:

     
Статус темы:
Закрыта.