Как отсортировать результаты MySQL по большинству совпадений при использовании LIKE

В настоящее время я работаю над запросом, который должен отображать список всех статей из определенной таблицы, но он должен сортировать список в соответствии с формой поиска, чтобы сначала отображались статьи, содержащие большинство / лучших совпадений, и те, которые делают не будет никаких совпадений, будет отображаться последним отсортированным в алфавитном порядке.

Я сделал этот код, который работает нормально, хотя я не могу найти способ сортировки совпадений по большинству ударов / релевантности.

Вот мой код:

$search = $_POST["searhwords"]; $search = preg_replace('/\s+/', ' ',$search); $SearchQueryArray = str_replace(",", "", $search); $SearchQueryArray = str_replace(" ", ",", $SearchQueryArray); $SearchQueryArray = explode(',', $SearchQueryArray); $outputtt1 = ''; $outputtt2 = ''; foreach ( $SearchQueryArray as $queryword ) { $outputtt1 .= "title LIKE '%".$queryword."%' OR "; $outputtt2 .= "title NOT LIKE '%".$queryword."%' AND "; } $outputtt1 = rtrim($outputtt1, ' OR '); $outputtt2 = rtrim($outputtt2, ' AND '); $query_for_result = mysql_query("SELECT * from mytable WHERE ".$outputtt1." union all SELECT * from mytable WHERE ".$outputtt2." "); 

Поэтому мне нужно найти способ сортировки статьи, содержащей совпадения, так что сначала будут отсортированы те, которые содержат большинство совпадений.

Вы можете увидеть сценарий, который я сделал здесь: http://www.genius-webdesign.com/test/querytest.php

Вот SQL, который делает это:

 select t.* from mytable order by ((title like '%keyword1%') + (title like '%keyword2%') + (title like '%keyword3%') + . . . (title like '%keywordn%') ) desc; 

MySQL обрабатывает логические выражения как числа, а true – 1 . Таким образом, это подсчитывает количество совпадений.

Кстати, если ваши данные имеют какой-либо размер, вы можете найти полнотекстовый поиск более эффективным, чем использование like .

РЕДАКТИРОВАТЬ:

Подсчет количества ключевых слов несколько сложнее, но вы можете сделать это как:

 order by ((length(replace(title, 'keyword1', 'x')) - length(replace(title, 'keyword1', '') ) + (length(replace(title, 'keyword2', 'x')) - length(replace(title, 'keyword2', '') ) + . . . (length(replace(title, 'keywordn', 'x')) - length(replace(title, 'keywordn', '') ) ); 

Подсчет количества появления ключевого слова является более громоздким, чем просто поиск того, где он или нет.

Другой способ сделать это с помощью полнотекстового поиска

 SELECT *, MATCH('title') AGAINST($_GET['query']) * 10 as score1, MATCH('content') AGAINST($_GET['query']) * 5 AS score2 FROM articles WHERE MATCH (title, content) AGAINST($_GET['query']) ORDER BY (score1) + (score2) DESC; 

При необходимости измените таблицу таким образом

 ALTER TABLE articles ENGINE = MYISAM; ALTER TABLE articles ADD FULLTEXT(title, content);