12.7k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von uesch Mitglied (135 Punkte)
Hallo allerseits,

wie kann ich Daten aus einer MySQL-Tabelle so sortieren, dass das oberste Wort am ähnlichsten zum eingegebenen Wort ist und darunter die Ähnlichkeit immer mehr abnimmt? Momentan sortiert er nach dem Alphabet, aber ich möchte eine Sortierung nach der Ähnlichkeit mit dem eingegebenen Wort. Also zum Beispiel:

Eingegebenes Wort: Haus
1. Ergebnis = Haus
2. Ergebnis = Rathaus
3. Ergebnis = durchaus

Ich habe versucht, es mit levenshtein zu realisieren:
SELECT * FROM ".$table
." WHERE irgendwas like '%".$search."%' or irgendwas2 like '%".$search."%' order by ".levenshtein(???)."


Muss ich zwei Abfragen machen? Die erste fragt nach der Ähnlichkeit ab und die zweite selected dann die Datensätze und sortiert sie nach dem levenshtein-Wert? Oder kann ich das ganze mit was anderem als levenshtein machen?

Vielen Dank

23 Antworten

0 Punkte
Beantwortet von uesch Mitglied (135 Punkte)
Ok, ich habs jetzt hinbekommen. Vielen Dank.

Das wichtige war erstens, dass das
$i1++;
nicht im if-Statement stehen durfte, sondern außerhalb im foreach. Und zweitens, dass das $iAnzahl nicht dem zweiten Wert beim LIMIT entspricht, weil du ja hier
$iStart+ $iAnzahl
als Limit nimmst und das $iAnzahl somit einen festen Wert von 10 haben muss.

Also, vielen Dank nochmal!

Schönen Gruß von Üsch.
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Ähm...

$i1++ stand niemals innerhalb des If-Blocks.

Und laut dev.mysql.com/doc/refman/5.0/en/select.html
The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be non-negative integer constants (except when using prepared statements).

With two arguments, the first argument specifies the offset of the first row to return, and the second specifies the maximum number of rows to return. The offset of the initial row is 0 (not 1):

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Keine Ahnung, was du da verändert (oder gar falsch abgetippt statt kopiert) hast, aber es funktionierte von Anfang an so wie ichs geschrieben hab :(
0 Punkte
Beantwortet von uesch Mitglied (135 Punkte)
Du hast Recht, ich habe mir hinter
if ( $i1>= $iStart&& $i1< $iStart+ $iAnzahl )
ein "{" hinzugedichtet. Dachte, da hätte eins gestanden. Tut mir Leid.

Also vielen Dank.
...