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

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

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 запрос к базе данных?
 
уникальность всеже похоже не по site-id, а просто по site
 
Код:
select distinct distinct site, text from table 
where text like ('%text1%') or text like ('%text2%') 
order by site

id в вашме случае просто сквозной идентификатор, по нему нет смысла ограничений ставить, он и так выдает уникальные записи
 
Код:
select distinct distinct site, text from table 
where text like ('%text1%') or text like ('%text2%') 
order by site
Похоже имелось ввиду что записи следуют так: сначала 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.
 
да не, я думаю тут как раз надо смешивать, ТС это же сео?
 
спасибо всем, разобрался сам.
вот мое решение:

SELECT result.* FROM ((SELECT 1 as ord,art1.* FROM articles as art1 WHERE text LIKE '%кино аватар%') UNION (SELECT 2 as ord,art1.* FROM articles as art1 WHERE text LIKE '%кино%')) as result GROUP BY result.domain ORDER BY ord ASC
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху