Du bist nicht eingeloggt! Möglicherweise kannst du deswegen nicht alles sehen.
  (Noch kein mods.de-Account? / Passwort vergessen?)
Zur Übersichtsseite
Hallo anonymer User.
Bitte logge dich ein
oder registriere dich!
 Moderiert von: Che Guevara


 Thema: Teil String in Datenbank finden
erste ungelesene Seite | letzter Beitrag 
unitrialer

Arctic
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ß
06.12.2008 0:14:25  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Teufel

AUP Teufel 21.04.2008
 
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]
06.12.2008 0:59:43  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
rABBI

Arctic
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?
06.12.2008 0:59:46  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
igor]2

Phoenix
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.
06.12.2008 10:04:58  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
unitrialer

Arctic
@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.
06.12.2008 12:10:50  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
unitrialer

Arctic
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]
06.12.2008 14:42:18  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Smoking

AUP Smoking 09.09.2023
Einfach nur LENGTH. Das sollte jedes DBMS implementiert haben.
06.12.2008 17:54:17  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
rABBI

Arctic
mit
concat('%',col,'%')
statt
col
solltest du gleich die exakte länge kriegen.
06.12.2008 19:07:53  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
White[AoT]

Arctic
 
Zitat von Smoking

Einfach nur LENGTH. Das sollte jedes DBMS implementiert haben.




mssql will "len"
11.12.2008 16:10:47  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
 Thema: Teil String in Datenbank finden


mods.de - Forum » Webdesign & Coding » 

Hop to:  

Thread-Tags:
| tech | impressum