Trier les résultats de recherche de MySQL par la position de la requête de recherche dans la chaîne en utilisant PHP
Question
Je veux que mes résultats de la recherche pour être en ordre de position de la chaîne du plus petit au plus grand. Par exemple, la recherche de rendements « banane »:
, les prunes, les aliments pour bébés bananes et du riz, tendues
Bananes, déshydratés, ou de la poudre de banane
Les bananes, cru
Pain, banane, préparés à partir de recette, faites avec la margarine
CAMPBELL Soup Company, V8 SPLASH boissons de jus, banane fraise
CAMPBELL Soup Company, V8 SPLASH smoothies, Strawberry Banana
CAMPBELL Soup Company, V8 V. FUSION Jus, Banane Fraise
Je veux « bananes, cru » à venir d'abord parce que « banane » est le premier mot dans le résultat, et je veux « CAMPBELL Soup ... » pour trouver la dernière parce que « banane » est le dernier mot.
Je sais que je peux utiliser strpos () pour trouver la position, mais comment puis-je mettre tout cela ensemble?
La solution
Vous pouvez le faire facilement dans MySQL.
SELECT title,LOCATE('banana',title)
FROM myTable
WHERE LOCATE('banana',title) > 0
ORDER BY LOCATE('banana',title)
titre représentent la colonne de la table MySql.
Autres conseils
Il impliquera un meilleur pour faire usort
ou quelque chose de similaire en PHP inutilement complexe, dans la requête, par exemple:
SELECT data, INSTR(data, 'banana') as index
FROM table
WHERE data LIKE '%banana%'
ORDER BY index != 0, index
Vous pouvez également sélectionner INSTR(titles, 'banana') as firstIndex
et de l'ordre par cette valeur, ASC. Cela renvoie l'index du premier indice situé de l'aiguille dans le botte de foin. Tag sur une clause de WHERE
qui omet tout ce qui ne LIKE
'%banana%'
et vous devez définir:
SELECT id, pubdate, title, INSTR(title, 'tea') as `index`
FROM article
WHERE title LIKE '%tea%'
ORDER BY `index` ASC;
Si vous ne recevez pas que les données à partir d'une requête SQL, vous pouvez trier qu'utiliser usort
et < a href = "http://php.net/strpos" rel = "nofollow noreferrer"> stripos
; quelque chose comme ceci devrait faire:
$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);
i.e.. vous triez ici avec vous propre fonction définie, qui compare la position (cas insentive) de « banane » dans les deux chaînes qu'il reçoit en tant que paramètres.
Et vous obtiendrez ce genre de sortie pour votre tableau, une fois triées:
$ /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"
}
Bien sûr, si vous obtenez ces données à partir d'une requête SQL, il pourrait être plus facile de faire des calculs sur le additionnels côté SQL ...
si vous voulez juste imiter strpos:
select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)