Сортировать результаты поиска из MySQL по позиции поискового запроса в строке, используя PHP - PullRequest
4 голосов
/ 12 января 2010

Я хочу, чтобы мои результаты поиска были в порядке расположения строк от наименьшего к наибольшему. Например, поиск «банан» возвращает:


Детское питание, сливы, бананы и рис, процеженные

Бананы, обезвоженные или банановый порошок

бананы, сырые

Хлеб банановый, приготовленный по рецептуре, приготовленный с маргарином

CAMPBELL Soup Company, V8 SPLASH Сокосодержащие напитки, банан с клубникой

CAMPBELL Soup Company, V8 SPLASH Smoothies, Клубничный банан

CAMPBELL Soup Company, V8 V. FUSION Соки, Клубника, Банан


Я хочу, чтобы «Bananas, raw» был первым, потому что «banana» - первое слово в результате, и я хочу, чтобы «CAMPBELL Soup ...» был последним, потому что «banana» - последнее слово.

Я знаю, что могу использовать strpos (), чтобы найти позицию, но как мне все это собрать?

Ответы [ 5 ]

3 голосов
/ 12 января 2010

Вы можете легко сделать это в MySQL.


 SELECT  title,LOCATE('banana',title)
 FROM myTable   
 WHERE  LOCATE('banana',title) > 0
 ORDER BY LOCATE('banana',title) 

заголовок представляет столбец таблицы MySql.

0 голосов
/ 12 января 2010

Если вы не получите эти данные из запроса SQL, вы можете отсортировать их, используя usort и stripos; что-то вроде этого должно сделать:

$arr = array(
    "Babyfood, plums, bananas and rice, strained", 
    "Bananas, dehydrated, or banana powder", 
    "Bananas, raw", 
    "Bread, banana, prepared from recipe, made with margarine", 
    "CAMPBELL Soup Company, V8 SPLASH Juice Drinks, Strawberry Banana", 
    "CAMPBELL Soup Company, V8 SPLASH Smoothies, Strawberry Banana", 
    "CAMPBELL Soup Company, V8 V. FUSION Juices, Strawberry Banana", 
);

function compare_position($a, $b) {
    return stripos($a, 'banana') - stripos($b, 'banana');
}

usort($arr, 'compare_position');
var_dump($arr);

т.е. Вы здесь сортируете с помощью своей собственной определенной функции, которая сравнивает позицию (без учета регистра) слова «Банан» в двух строках, которые он получает в качестве параметров.


И вы получите такой вывод для вашего массива, как только он будет отсортирован:

$ /usr/local/php-5.3/bin/php temp.php
array(7) {
  [0]=>
  string(37) "Bananas, dehydrated, or banana powder"
  [1]=>
  string(12) "Bananas, raw"
  [2]=>
  string(56) "Bread, banana, prepared from recipe, made with margarine"
  [3]=>
  string(43) "Babyfood, plums, bananas and rice, strained"
  [4]=>
  string(61) "CAMPBELL Soup Company, V8 SPLASH Smoothies, Strawberry Banana"
  [5]=>
  string(61) "CAMPBELL Soup Company, V8 V. FUSION Juices, Strawberry Banana"
  [6]=>
  string(64) "CAMPBELL Soup Company, V8 SPLASH Juice Drinks, Strawberry Banana"
}


Конечно, если вы получаете эти данные из SQL-запроса, может быть проще выполнить некоторые дополнительные вычисления на стороне SQL ...

0 голосов
/ 12 января 2010

Это будет включать в себя слишком сложный usort или что-то подобное в PHP, лучше всего сделать это в запросе, например:

SELECT data, INSTR(data, 'banana') as index
FROM table
WHERE data LIKE '%banana%'
ORDER BY index != 0, index
0 голосов
/ 12 января 2010

, если вы просто хотите подражать strpos:

select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)
0 голосов
/ 12 января 2010

Вы также можете выбрать INSTR(titles, 'banana') as firstIndex и упорядочить по этому значению, ASC. Это вернет индекс первого расположенного указателя иглы в стоге сена. Пометьте в предложении WHERE, что пропускает все, что не LIKE '%banana%', и вы должны установить:

SELECT id, pubdate, title, INSTR(title, 'tea') as `index`
FROM article
WHERE title LIKE '%tea%'
ORDER BY `index` ASC;
...