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

StackOverflow https://stackoverflow.com/questions/2046784

  •  20-09-2019
  •  | 
  •  

Вопрос

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


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

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

Бананы сырые

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

CAMPBELL Soup Company, Соковые Напитки V8 SPLASH, Клубнично-Банановый

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

Суповая компания КЭМПБЕЛЛ, V8 V.Соки ФЬЮЖН, Клубнично-Банановый


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

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

Это было полезно?

Решение

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


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

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

Другие советы

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

SELECT data, INSTR(data, 'banana') as index
FROM table
WHERE data LIKE '%banana%'
ORDER BY index != 0, index

Вы также можете выбрать 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;

Если вы не получаете эти данные из 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);

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


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

$ /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...

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

select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top