Сортировать результаты поиска из MySQL по положению поискового запроса в строке с помощью PHP

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


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

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

Бананы, сырые

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

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

CAMPBELL Soup Company, Смузи V8 SPLASH, Клубнично-банановый

CAMPBELL Soup Company, V8 V. FUSION Juices, клубнично-банановый


Я хочу, чтобы «Банан, сырой» стоял первым, потому что «банан» — это первое слово в результате, и я хочу, чтобы «Суп КЭМПБЕЛЛ...» стоял последним, потому что «банан» — это последнее слово.

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


person Community    schedule 12.01.2010    source источник
comment
Добро пожаловать в StackOverflow. Отличный первый вопрос!   -  person Sampson    schedule 12.01.2010
comment
Эй, спасибо, что принял меня! Так много отличных ответов так быстро! Мне нужно потратить минуту, чтобы попробовать их.   -  person    schedule 12.01.2010


Ответы (5)


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


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

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

person Adeel    schedule 12.01.2010
comment
Да!! Этот работает! Я пробовал некоторые из других, но я не заставил их работать. Я думаю, что моих знаний MySQL было недостаточно. Но это было настолько просто, что я просто вставил имя своей таблицы и имя столбца, и бац сделал именно то, что я хотел. - person ; 12.01.2010

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

SELECT data, INSTR(data, 'banana') as index
FROM table
WHERE data LIKE '%banana%'
ORDER BY index != 0, index
person tanerkay    schedule 12.01.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;
person Sampson    schedule 12.01.2010
comment
Индекс не основан на 0, т. е. 0 означает, что его нет в строке, 1 означает, что он находится в начале строки. - person tanerkay; 12.01.2010
comment
Да, я в курсе того энбуюкфенера :) - person Sampson; 12.01.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...

person Pascal MARTIN    schedule 12.01.2010

если вы просто хотите эмулировать strpos:

select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)
person jspcal    schedule 12.01.2010