Suchergebnisse sortieren von MySQL durch die Position der Suchabfrage in der Zeichenfolge mit PHP
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?
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 ...
, wenn Sie nur wollen strpos emulieren:
select col, locate('banana', col) as pos from t
order by pos < 1, pos, length(col)