Classificar os resultados da pesquisa do MySQL pela posição da consulta de pesquisa na string usando PHP

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

  •  20-09-2019
  •  | 
  •  

Pergunta

Quero que meus resultados de pesquisa estejam em ordem de posição da string do menor para o maior. Por exemplo, pesquisar por "banana" retorna:


Babyfood, ameixas, bananas e arroz, tenso

Bananas, desidratadas ou bananeira em pó

Bananas, cru

Pão, banana, preparado a partir da receita, feita com margarina

Campbell Soup Company, V8 Splash Juice Drinks, Strawberry Banana

Campbell Soup Company, V8 Splash Smoothies, banana de morango

Campbell Soup Company, V8 V. sucos de fusão, banana de morango


Eu quero que "bananas, cru" venham em primeiro lugar porque "banana" é a primeira palavra no resultado, e eu quero "Sopa de Campbell ..." para passar por último porque "banana" é a última palavra.

Eu sei que posso usar strpos () para encontrar a posição, mas como faço para montar tudo?

Foi útil?

Solução

Você pode fazer isso facilmente no MySQL.


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

O título representa a coluna da tabela MySQL.

Outras dicas

Envolverá um complexo desnecessariamente usort Ou algo semelhante no PHP, é melhor fazê -lo na consulta, por exemplo:

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

Você também pode selecionar INSTR(titles, 'banana') as firstIndex e ordem por esse valor, ASC. Isso retornará o índice do primeiro índice localizado da agulha dentro do palheiro. Tag em um WHERE Cláusula que omite qualquer coisa que não seja LIKE '%banana%' E você deve estar definido:

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

Se você não receber esses dados de uma consulta SQL, pode classificar isso usando usort e stripos ; algo assim deve fazer:

$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);

Ou seja, você está aqui classificando com sua própria função definida, que compara a posição (entre caso de caso) de "banana" nas duas strings que recebe como parâmetros.


E você obterá esse tipo de saída para sua matriz, uma vez classificada:

$ /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"
}


Obviamente, se você receber esses dados de uma consulta SQL, pode ser mais fácil fazer alguns cálculos adicionais no lado SQL ...

Se você só quer emular strpos:

select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top