Classificar os resultados da pesquisa do MySQL pela posição da consulta de pesquisa na string usando PHP
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?
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)