|
|
|
|
Hallo,
es geht um eine Abfrage einer Datenbank. Ich habe einen String gegeben, z.B. "Hello/World/ich/bin/da"
In der DB gibt es folgende Einträge:
Hello/World
Hello/Universe
Hello/World/and/Universe
Nun möchte ich (mit dem Beispielstring von oben) Hello/World finden. Quasi, die längste Übereinstimmung zwischen String und Datenbankeinträgen.
Wie mach ich das am geschicktesten? Mit einem Query? Mit einer Funktion/Prozedur? Als Rückgabewert hätte ich dann auch gerne nur EINEN Eintrag!
Gruß
|
|
|
|
|
|
|
|
PHP: |
<?php
$sql = "SELECT * FROM `table` WHERE `spalte` LIKE %Hello WOrld%;"
$query = mysql_query($sql) or die(mysql_error);
while($result = mysql_fetch_object($query)) {
echo $result->spaltenname;
break;
}
?>
|
|
oder sowas.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Teufel am 06.12.2008 1:00]
|
|
|
|
|
|
sag mal genauer an, was du brauchst:
matching auf längstmöglichen string? matching auf längstmögliche liste (getrennt mit "/")?
ersteres ist mies aufwändig, zweiteres könnte man auf tokens aufsplitten und die sache drastisch beschleunigen.
also sprich, was ist gefordert?
|
|
|
|
|
|
|
Denkanstoß: Bestmögliches Teilstring-Matching ist ein Problem, was mit großen Datenmengen in der DNA-Analyse auftaucht. In den letzten ~20 Jahren sind da eine Menge Algorithmen entwickelt worden. Vielleicht ist da was dabei. Dürfte allerdings ggf. schwer werden, sowas auf ner handelsüblichen Datenbank umzusetzen. Eventuell gibts ja Zusatzmodule.
|
|
|
|
|
|
|
@Teufel, nein nicht ganz eigentlich bräuchte ich es genau andersherum: SELECT * FROM tbl WHERE $string LIKE %col%
Ich habe ein bisschen herumgespielt, so einfach ging das natürlich nicht...
@rabbi: längstmögliche liste und string sind hier eigentlich das gleiche. Als Token sind "." und "/" vorhanden.
@igor: ich hoffe nicht, dass das so komplex wird. Aber ich werde mir das mal anschauen, danke dir.
|
|
|
|
|
|
|
Anknüpfend an des Teufels Vorschlag, mit meiner Umdrehung denke ich habe ich eine Lösung, die für mich funktioniert:
Das Query sieht so aus:
SELECT *, CHAR_LENGTH(col) as len FROM tbl WHERE $string LIKE col ORDER BY len DESC LIMIT 1;
Wichtig ist, dass in der Datenbank die Einträge so stehen:
%Hello/World%
%Hello/Universe%
Damit der LIKE Operator funktioniert.
// edit: Die Funktion CHAR_LENGTH ist MySQL spezifisch. Gibts da was allgemein gültiges? Damit ich meinen Code später vlt. auch auf Pgsql nutzen kann?
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von unitrialer am 06.12.2008 14:43]
|
|
|
|
|
|
Einfach nur LENGTH. Das sollte jedes DBMS implementiert haben.
|
|
|
|
|
|
|
mit concat('%',col,'%') statt col solltest du gleich die exakte länge kriegen.
|
|
|
|
|
|
|
| Zitat von Smoking
Einfach nur LENGTH. Das sollte jedes DBMS implementiert haben.
| |
mssql will "len"
|
|
|
|
|
|
Thema: Teil String in Datenbank finden |