Trier les résultats de recherche de MySQL par la position de la requête de recherche dans la chaîne en utilisant PHP

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

  •  20-09-2019
  •  | 
  •  

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?

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top