Ähnlichkeit

Ähnlichkeit

am 04.02.2007 14:30:14 von Mathias

Hallo Leute,
ich brauche mal einen Denkanstoß.
Wenn ich in einer DB in einem VARCHAR Feld Postleitzahlen habe. Sagen wir
mal 01922, 01877, 123456, 25867.
Ich gebe nun zur Suche die PLZ 018 ein und suche mit like. das
funktioniert. Nun geb ich aber z.B. 45 ein und ich erhalte kein Ergebnis.
Logisch. Wie abr muß ich die Suche gestalten, damit mir bei der Eingabe von
45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
angegeben wird?

mfg

Mathias

Re: Ähnlichkeit

am 04.02.2007 16:04:42 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Ähnlichkeit

am 04.02.2007 16:21:41 von Mathias

Am Sun, 4 Feb 2007 16:04:42 +0100 schrieb Andreas Kretschmer:

> begin Mathias wrote:
>> Wenn ich in einer DB in einem VARCHAR Feld Postleitzahlen habe. Sagen wir
>> mal 01922, 01877, 123456, 25867.
>> Ich gebe nun zur Suche die PLZ 018 ein und suche mit like. das
>> funktioniert. Nun geb ich aber z.B. 45 ein und ich erhalte kein Ergebnis.
>> Logisch. Wie abr muß ich die Suche gestalten, damit mir bei der Eingabe von
>> 45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
>> angegeben wird?
>
> Was verstehst Du in Deinem Beispiel unter Ähnlichkeit zwischen '45' und
> '25867'? Ich könnte Dir bei 45 und 123456 folgen, weil die Zeichenfolge
> '45' in '12345' vorkommt.
>
>
> end
> Andreas

Nein. Mein suche lautet .....plz like "$wert%"
Das bedeutet, in $wert steht die Sucheingabe des Users z.B. 45. Bei like
würde jetzt alles angezeigt was mit 45 beginnt. Soweit so gut. Aber es gibt
keinen Eintrag in der DB der mit 45 beginnt. Nach den Postleitzahlensystem
wäre jetzt die PLZ 25687 die am nächsten vorkommende in der Liste. Und
genau die soll ausgegebn werden.

mfg

Mathias

Re: Ähnlichkeit

am 04.02.2007 16:30:21 von Christian Kirsch

Am 04.02.2007 14:30 schrieb Mathias:
> Hallo Leute,
> ich brauche mal einen Denkanstoß.
> Wenn ich in einer DB in einem VARCHAR Feld Postleitzahlen habe. Sagen wir
> mal 01922, 01877, 123456, 25867.

Dann hat man einen Designfehler in seiner Datenbank.

> Ich gebe nun zur Suche die PLZ 018 ein und suche mit like.
> das
> funktioniert. Nun geb ich aber z.B. 45 ein und ich erhalte kein Ergebnis.

Suchst Du jetzt auf einmal *nicht* mit like oder warum bekommst Du da
kein Ergebnis?

> Logisch. Wie abr muß ich die Suche gestalten, damit mir bei der Eingabe von
> 45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
> angegeben wird?

Du musst erstmal Deine Daten normalisieren. Und dann musst Du Dir eine
Metrik überlegen, die Deine Vorstellung von "am nächsten" beschreibt.
Mir fiele da auf Anhieb sowas wie MIN(ABS(PLzges - PLZ)) ein, aber
möglicherweise meinst Du ja was anderes.

Re: Ähnlichkeit

am 04.02.2007 16:55:47 von newsgroup

Christian Kirsch schrieb:
> Am 04.02.2007 14:30 schrieb Mathias:
>
>>Hallo Leute,
>>ich brauche mal einen Denkanstoß.
>>Wenn ich in einer DB in einem VARCHAR Feld Postleitzahlen habe. Sagen wir
>>mal 01922, 01877, 123456, 25867.
>
>
> Dann hat man einen Designfehler in seiner Datenbank.

Und der wäre?

Gruß,
Michael

Re: Ähnlichkeit

am 04.02.2007 17:46:20 von Axel Schwenke

Mathias wrote:
> Am Sun, 4 Feb 2007 16:04:42 +0100 schrieb Andreas Kretschmer:
>> Mathias wrote:

>>> Wenn ich in einer DB in einem VARCHAR Feld Postleitzahlen habe. Sagen wir
>>> mal 01922, 01877, 123456, 25867.
>>> Ich gebe nun zur Suche die PLZ 018 ein und suche mit like. das
>>> funktioniert. Nun geb ich aber z.B. 45 ein und ich erhalte kein Ergebnis.
>>> Logisch. Wie abr muß ich die Suche gestalten, damit mir bei der Eingabe von
>>> 45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
>>> angegeben wird?

>> Was verstehst Du in Deinem Beispiel unter Ähnlichkeit zwischen '45' und
>> '25867'?

> Mein suche lautet .....plz like "$wert%"

Also ein Präfix-Vergleich

> Das bedeutet, in $wert steht die Sucheingabe des Users z.B. 45. Bei like
> würde jetzt alles angezeigt was mit 45 beginnt. Soweit so gut. Aber es gibt
> keinen Eintrag in der DB der mit 45 beginnt. Nach den Postleitzahlensystem
> wäre jetzt die PLZ 25687 die am nächsten vorkommende in der Liste.

Aha. Das Konzept, das du abzubilden versuchst, ist "geographische
Nähe", realisiert hast du hingegen "Präfix-Übereinstimmung der
Postleitzahl". Dir ist schon klar, daß das in der Praxis beliebig
weit auseinanderklaffen kann?

Postleitzahlen werden praktisch beliebig vergeben. Weder müssen
benachbarte PLZ-Regionen überhaupt einen gemeinsamen Präfix haben
noch garantiert dir die gleiche Postleitzahl zweier Orte einen
(sinnvollen) Höchstabstand. Wenn ein Ort am Rande eines PLZ-Gebiets
liegt, kann der nächste Ort durchaus eine andere PLZ haben.

Vergiß ganz einfach die Metrik "Postleitzahl"!

Praktisch verwendet man für "geographische Nähe" auch Konzepte aus
der Geographie. Also typischerweise Ortskoordinaten. Für Deutschland
kann man damit auch flach rechnen (also eine lineare Beziehung
zwischen der Koordinatendifferenz und dem Abstand annehmen).

Was du also brauchst sind:

1. Koordinaten für die Objekte in deiner Datenbank.
2. eine Suchmöglichkeit "Objekte mit Abstand maximal Z von (X,Y)"

und wenn du bei PLZ (oder allgemein: Ortsnamen) bleiben willst:

3. eine Übersetzungstabelle PLZ <-> Koordinaten


Für 2. - und damit sind wir hier endlich wieder ontopic - bietet
MySQL spatiale Datentypen und Indizes:

http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.ht ml


XL

Re: Ähnlichkeit

am 04.02.2007 18:21:08 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Ähnlichkeit

am 04.02.2007 18:44:06 von Andreas Scherbaum

Mathias wrote:
>
> Wie abr muß ich die Suche gestalten, damit mir bei der Eingabe von
> 45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
> angegeben wird?

Was du suchst, hat nicht (viel) mit Datenbanken zu tun.
Zuerst bräuchtest du wohl mal das hier:

http://www.deutschepost.de/dpag?check=yes&lang=de_DE&xmlFile =1047

Und dann gibt es den ein oder anderen Anbieter, der zu einer PLZ
geografische Koordinaten liefert. Aus denen wiederum kannst du die
"Nähe" einer PLZ zu einer anderen berechnen. Das wird etwas rechen-
intensiv, vernünftige Datenbanken bieten dafür auch Datentypen, mit
denen man rechnen kann.

Ich habe das Spiel vor Jahren mal durch, aber das Datenformat oder
besser Unformat, in dem PLZen vorliegen, ist gelinde gesagt unschön.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: Ähnlichkeit

am 04.02.2007 20:13:07 von Mathias

Am Sun, 4 Feb 2007 18:44:06 +0100 schrieb Andreas Scherbaum:

> Mathias wrote:
>>
>> Wie abr muß ich die Suche gestalten, damit mir bei der Eingabe von
>> 45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
>> angegeben wird?
>
> Was du suchst, hat nicht (viel) mit Datenbanken zu tun.
> Zuerst bräuchtest du wohl mal das hier:
>
> http://www.deutschepost.de/dpag?check=yes&lang=de_DE&xmlFile =1047
>
> Und dann gibt es den ein oder anderen Anbieter, der zu einer PLZ
> geografische Koordinaten liefert. Aus denen wiederum kannst du die
> "Nähe" einer PLZ zu einer anderen berechnen. Das wird etwas rechen-
> intensiv, vernünftige Datenbanken bieten dafür auch Datentypen, mit
> denen man rechnen kann.
>
> Ich habe das Spiel vor Jahren mal durch, aber das Datenformat oder
> besser Unformat, in dem PLZen vorliegen, ist gelinde gesagt unschön.
>
>
> Bye

Erst mal danke für die vielen Antworten. Aber Ihr wollt gleich wieder zu
viel. Leute, ich hab ein Problem mit der Suchabfrage, aber ich bin nicht
doof. Das das keine Umkreissuche ist, weis ich auch. Das soll es auch nicht
sein. Ich möchte nur kein Leeres Ergebnis zurücggeben, egal wie weit der
Ort auch weg ist. Mir geht es nur darum, rein mathematisch die am nächsten
kommende Zahl zu finden. Einen ansatz hab ich jetzt:

SELECT * ROM tabellenname WHERE plz < "wert" ORDER BY plz DESC LIMIT 0
, 3 UNION SELECT * FROM tabellenname WHERE plz > "wert" ORDER BY plz
ASC LIMIT 0 , 3 UNION SELECT * FROM tabellenname WHERE plz = "wert"
ORDER BY plz

Muß wohl noch ein paar Klammern setzen. Mit Union hab ich mal wieder was,
womit ich noch nicht zu tun hatte.

mfg

Mathias

Re: Ähnlichkeit

am 04.02.2007 21:00:59 von Axel Schwenke

Andreas Kretschmer wrote:
> begin Axel Schwenke wrote:
>> 3. eine Übersetzungstabelle PLZ <-> Koordinaten
>
> Btw.: kennst Du oder jemand anders eine freie Quelle für sowas?

OpenGeoDB?


XL

Re: Ähnlichkeit

am 04.02.2007 21:29:08 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Ähnlichkeit

am 05.02.2007 01:35:38 von Axel Schwenke

Mathias wrote:
>
> Erst mal danke für die vielen Antworten. Aber Ihr wollt gleich wieder zu
> viel.

*Wir* wollen gar nichts. Aber zumindest ich nahm an, daß *du* wolltest.

> Leute, ich hab ein Problem mit der Suchabfrage, aber ich bin nicht
> doof. Das das keine Umkreissuche ist, weis ich auch. Das soll es auch nicht
> sein.

Warum schreibst du dann sowas wie "nach den Postleitzahlensystem wäre
jetzt ... die am nächsten vorkommende in der Liste"?

Mal abgesehen davon, daß es kein "Postleitzahlensystem" gibt - woran
bitte schön willst du festmachen, was "die am nächsten vorkommende"
PLZ sein soll? Beantworte diese Frage und du hast die Antwort.

> Ich möchte nur kein Leeres Ergebnis zurücggeben, egal wie weit der
> Ort auch weg ist.

Dann nimm einfach irgend einen Ort. ORDER BY RAND() LIMIT 1.
Noch schöner: nimm einen Dummy-Ort. "Musterhausen" oder "Lummerland"
würden sich anbieten. Wenn du sowieso keine Antwort bieten kannst,
dann mach auch deutlich daß deine Antwort keine ist.


Abgesehen davon: wenn ich eine Suchmaschine nach einem Ergebnis in der
Region XYZ frage, dann ist mir die Antwort "da haben wir nix" deutlich
lieber als ein freudestrahlendes "wir haben was in UVW", wenn UVW von
XYZ dann 5000km entfernt ist. Wenn ich dann noch feststelle, daß etwas
etwas in ABC gefunden wird und das nur 1000km von XYZ entfernt ist,
dann hat *diese* Suchmaschine bei mir verschissen. Lebenslang.

Kurz gesagt: ich halte dein "bloß kein leeres Ergebnis, im Zweifels-
fall ist es egal wie weit das weg ist" für nicht praxistauglich.


XL

Re: Ähnlichkeit

am 05.02.2007 11:25:38 von Mathias

Sag mal, kann man denn in dieser NG nicht einmal etwas fragen ohen immer
gleich dumm angemacht zu werden? Was hat Du denn nur für ein Problem? Ich
hab Dir doch nichts getan! Ich bin höflich, ruhig, stelle eine simple Frage
und muß mir dieses Gewäsch anhören! Lauetet meine Frage danach, ob Dir die
Suche gefällt? Nein ! Habe ich nach Entfernungsmessungen gefragt? Nein !
Dann bleib doch bitte bei den Tatsachen. Wenn Du ein Problem mit meiner
Fragestellung hast, kannst Du das doch einfach überlesen. Keiner zwingt
dich zu antworten.

Mathias

Re: Ähnlichkeit

am 05.02.2007 12:31:25 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Ähnlichkeit

am 05.02.2007 19:25:15 von Thomas Rachel

Mathias wrote:
^?
> Sag mal, kann man denn in dieser NG nicht einmal etwas fragen ohen immer
> gleich dumm angemacht zu werden?

Hast Du geschickt gemacht, das worauf Du Dich beziehst, wegzuschnippeln.

Was an Axels Posting hat Dich denn genau angegriffen und warum? Er hat Dir
eine Empfehlung gegeben und sonst nix.

> Wenn Du ein Problem mit meiner Fragestellung hast, kannst Du das doch
> einfach überlesen.

Wenn Du ein Problem mit einer Antwort hast, kannst Du das doch
> einfach überlesen.

Thomas
--
Ich sitz im Bus und drücke auf diesen roten Knopf, und vorne erscheint in
roter Schrift: »Wagen hält«. Ja, daß er nicht auseinanderfällt, ist mir auch
klar, aber ich will trotzdem aussteigen...

Re: Ähnlichkeit

am 06.02.2007 08:13:26 von Mathias

Wie aber muß ich die Suche gestalten, damit mir bei der Eingabe von
45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
angegeben wird?

Das war die Frage.
Wo seht Ihr Fragen nach geografischen Aspekten, Userdenken oder Meinungen?
Es ist eine simple Frage, weiter nichts.
Die Antwort, die ich nun mittlerweile selbst gefunden habe, wäre z.B.
gewesen:

Ein Select nach kleiner als verbinden mit Union mit einem Select größer als
und einem Select ist gleich. Dann habe ich eine Ergbnismenge, die der
Fragestellung entspricht.

Meine Lösung ist:

(SELECT firma, name, vorname, strasse, plz, ort, telefon, fax, mail, www,
logo FROM tabelle WHERE plz < \"".$searchplzNotFound."\" AND showReseller =
1 Order By plz DESC Limit 0,1)UNION(SELECT firma, name, vorname, strasse,
plz, ort, telefon, fax, mail, www, logo FROM tabelle WHERE plz >
\"".$searchplzNotFound."\" AND showReseller = 1 Order By plz ASC Limit
0,1)UNION(SELECT firma, name, vorname, strasse, plz, ort, telefon, fax,
mail, www, logo FROM tabelle WHERE plz = \"".$searchplzNotFound."\" AND
showReseller = 1 )Order By plz

Das wäre eine Antwort gewesen. Jetzt haben wir einen Thread mit 14
Beiträgen und die Lösung hab ich selbst gefunden. Ist zwar auch toll aber
mit etwas Hilfe zum Fragethema hätte ich mir 1 Tag ersparen können. Das ist
zwar nicht Eure Aufgabe und müssen tut Ihr auch nichts, das ist mir schon
klar. Aber weil ich Hilfe bei einem Problem gesucht habe war ich hier,
nicht um mich belehren zu lassen über Umkreissuche bei PLZ.

mfg

Mathias

P.S. Was habt Ihr für ein Problem mit meinem Realnamen? Das ist mein Name !

Re: Ähnlichkeit

am 06.02.2007 08:39:01 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Ähnlichkeit

am 06.02.2007 08:52:01 von Christian Kirsch

Mathias schrieb:
> Wie aber muß ich die Suche gestalten, damit mir bei der Eingabe von
> 45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
> angegeben wird?
>
> Das war die Frage.
> Wo seht Ihr Fragen nach geografischen Aspekten, Userdenken oder Meinungen?
> Es ist eine simple Frage, weiter nichts.

Wo siehst Du Anhaltspunkte dafür, dass jemand seine eigenen Gedanken in
Bezug auf seine Frage nicht äußern darf? Wie Thomas schon sagte: Wenn
Dir eine Antwort nicht gefällt, lies sie einfach nicht.

>
> P.S. Was habt Ihr für ein Problem mit meinem Realnamen? Das ist mein Name !

Üblicherweise versteht man unter einem Realnamen einen kompletten. Wenn
Deine Eltern ohne Nachnamen durch die Gegend gelaufen sind, dann ist
natürlich klar, dass Du auch keinen haben kannst.

Re: Ähnlichkeit

am 06.02.2007 11:01:18 von Andreas Scherbaum

Hallo,

Mathias wrote:
> Wie aber muß ich die Suche gestalten, damit mir bei der Eingabe von
> 45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
> angegeben wird?

Äh, kannst du mal irgendwie darlegen, wie du von '45' auf '25867'
als "nächste" PLZ kommst? Also, welche Bedingungen du dafür anwendest?
Behandelst du '45' als '45000' oder als 'xxx45' oder irgendwo mittendrin?


> Meine Lösung ist:
>
> (SELECT firma, name, vorname, strasse, plz, ort, telefon, fax, mail, www,
> logo FROM tabelle WHERE plz < \"".$searchplzNotFound."\" AND showReseller =
> 1 Order By plz DESC Limit 0,1)UNION(SELECT firma, name, vorname, strasse,
> plz, ort, telefon, fax, mail, www, logo FROM tabelle WHERE plz >
> \"".$searchplzNotFound."\" AND showReseller = 1 Order By plz ASC Limit
> 0,1)UNION(SELECT firma, name, vorname, strasse, plz, ort, telefon, fax,
> mail, www, logo FROM tabelle WHERE plz = \"".$searchplzNotFound."\" AND
> showReseller = 1 )Order By plz

reichlich kompliziert, aber wenn das deinem Lösungsansatz entspricht, den
du gesucht, aber hier nicht erklärt hast, in Ordnung.


> P.S. Was habt Ihr für ein Problem mit meinem Realnamen? Das ist mein Name !

Ja, in Deutschland hat man in der Regel jedoch einen Vor- und einen Zunamen.
Welcher davon ist das und wo ist der andere?


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: Ähnlichkeit

am 06.02.2007 11:22:04 von Harald Fuchs

In article ,
Mathias writes:

> Wie aber muß ich die Suche gestalten, damit mir bei der Eingabe von
> 45 die nächte (ähnlichste) in der DB vorkommende Zahl (also 25867)
> angegeben wird?

> Das war die Frage.
> Wo seht Ihr Fragen nach geografischen Aspekten, Userdenken oder Meinungen=
?
> Es ist eine simple Frage, weiter nichts.

Diese Frage hast Du armer Nachnamenloser auf eine Art gestellt, daß
offensichtlich kein Mensch außer Dir selbst sie verstanden hat. Ich
sehe keinerlei Ähnlichkeit zwischen "45" und "25867".

Re: Ähnlichkeit

am 06.02.2007 23:41:19 von Philipp Taprogge

Hi!

Mathias wrote:
> Ich hab Dir doch nichts getan! Ich bin höflich, ruhig, stelle eine simple Frage
> und muß mir dieses Gewäsch anhören! Lauetet meine Frage danach, ob Dir die
> Suche gefällt? Nein ! Habe ich nach Entfernungsmessungen gefragt? Nein !
> Dann bleib doch bitte bei den Tatsachen. Wenn Du ein Problem mit meiner
> Fragestellung hast, kannst Du das doch einfach überlesen.

Aber das ist doch gerade das Problem. Man kann nicht deinen Denkfehler
überlesen und dir dennoch helfen.
Mehrere Leute hier haben versucht, es dir zu erklären, aber scheinst es
immer zu überlesen.

Postleitzahlen _haben_kein_System_!

Zumindest kein offizielles und allgemein bekanntes.
Solange du also nicht in der Lage bist, zu erklären, welchen Regeln sie
bei deiner Suche folgen sollen, kann dir auch niemand helfen.

Nehmen wir eine Postleitzahl X, die lautet deine Formel, die die
"nächste" PLZ berechnet?

Beantworte das, und man wird dir vielleicht helfen können.

Bis denne,

Phil