Suchergebnisse sortieren von MySQL durch die Position der Suchabfrage in der Zeichenfolge mit PHP

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

  •  20-09-2019
  •  | 
  •  

Frage

mag ich meine Suchergebnisse in der Reihenfolge der String Lage sein, vom kleinsten bis zum größten. Zum Beispiel der Suche nach „Banane“ Rückgabe:


Babykost-, Pflaumen, Bananen und Reis, angespannt

Bananen, getrocknet, banane oder Pulver

Bananen, roh

Brot, Banane, von Rezept zubereitet, hergestellt mit Margarine

CAMPBELL Soup Company, V8 SPLASH Fruchtsaftgetränke, Erdbeere Banane

CAMPBELL Soup Company, V8 SPLASH Smoothies, Erdbeere Banane

CAMPBELL Soup Company, V8 V. FUSION Säfte, Erdbeere Banane


ich will „Bananen, roh“ zuerst zu kommen, weil „Banane“ ist das erste Wort in der Folge, und ich will „CAMPBELL Soup ...“ letzten kommen, weil „Banane“ ist das letzte Wort.

Ich weiß, ich strpos verwenden kann (), um die Position zu finden, aber wie kann ich es alle zusammen?

War es hilfreich?

Lösung

Sie können dies in MySQL leicht tun.


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

Titelspalte von MySql Tabelle darstellen.

Andere Tipps

Es wird ein unnötig komplex usort oder etwas ähnliches in PHP beinhaltet, am besten in der Abfrage zu tun, zum Beispiel:

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

Sie können auch wählen INSTR(titles, 'banana') as firstIndex und um von diesem Wert, ASC. Dadurch wird der Index des ersten befindet Index der Nadel im Heuhaufen zurück. Tag auf einer WHERE Klausel, dass auslässt alles, was nicht LIKE '%banana%' ist und Sie sollten eingestellt werden:

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

Wenn Sie nicht bekommen, die Daten aus einer SQL-Abfrage, können Sie sortieren, dass die Verwendung usort und < a href = "http://php.net/strpos" rel = "nofollow noreferrer"> stripos ; so etwas wie dies tun soll:

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

d. Sie sind hier Sortierung mit Ihnen Funktion definiert selbst, dass die Position (Fall-insentive) von „Banana“ in den beiden Zeichenketten vergleicht sie als Parameter erhält.


Und Sie werden diese Art von Ausgabe für die Array erhalten, einmal nach:

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


Natürlich, wenn Sie die Daten aus einer SQL-Abfrage erhalten, könnte es einfacher sein, einige zusaetzliche Berechnungen auf der SQL-Seite ...

zu tun

, wenn Sie nur wollen strpos emulieren:

select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top