Maresa P.: MySQL: PLZ von Ort extrahieren

Hallo liebes Forum,

ich habe in einer MySQL Datenbank in der Tabelle 'address' mehrere Adressen gespeichert.
Unter Anderem gibt es in der Tabelle eine Spalte 'City', welche derzeit die PLZ und den Ort der Adresse enthält.

Bspl. von Einträgen in der Spalte City:

| id |    city       |
----------------------
|  1 | 50968 Köln    |
|  2 | 22043 Hamburg |
|  3 | 28213 Bremen  |

Dies macht für meine Anforderungen wenig Sinn, da ich die PLZ eigenständig verarbeiten muss.

Ich habe nun der Tabbelle 'address' eine zweite Spalte 'zip' zugefügt in der die Postleitzahl abgespeichert werden soll.

also so:

| id | zip   | city    |
------------------------
|  1 | 50968 | Köln    |
|  2 | 22043 | Hamburg |
|  3 | 28213 | Bremen  |

Dummerweise sind in meiner Tabelle jedoch schon mehrere Hundert Datensätze vorhanden, welche ich nun anpassen muss. Natürlich könnte ich dies manuell machen, erscheint mir jedoch zu umständlich.

Frage: Kann ich die bestehenden Datensätze auch mit einer SQL Query automatisiert ändern? Wenn ja, wie muss dies query lauten.

Vielen Dank für Euere Hilfe!

Maresa P.

  1. Hello,

    |  1 | 50968 Köln    |

    Ist dieses Format verbindlich oder könnte da auch schon mal

    | 97 | 20 Hamburg    |

    deinstehen?

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  2. hi,

    Frage: Kann ich die bestehenden Datensätze auch mit einer SQL Query automatisiert ändern? Wenn ja, wie muss dies query lauten.

    schau dich mal bei den zeichenketten-funktionen im manual am, http://dev.mysql.com/doc/mysql/de/String_functions.html.

    LEFT, SUBSTRING etc. könnten dir weiterhelfen.

    allerdings solltest du Toms frage vorher klären, denn die antwort darauf entscheidet natürlich darüber, wie "einfach" das zu machen ist.

    gruß,
    wahsaga

    --
    I'll try being nicer if you'll try being smarter.
  3. mit SQL weiss ich nicht.
    mit PHP kann man das allerdings ganz einfach gestalten, soweit du über ein wenig PHP-Kenntnisse verfügst und PHP auf dem Server/Rechner installiert ist.

    <?
    mysql_connect("<Datenbank>","<Benutzer>","<Passwort>");
    mysql_select_db("<Datenbank-Name>");
    $temp = mysql_query("SELECT id,city FROM adress") or die("Kein SELECT m&ouml;glich");
    while($x=mysql_fetch_row($temp)){
      $id=$x[0];
      $city=$x[1];
      $zip,$city=explode(" ","$city");  // <- hier trennt er PLZ und Stadtnamen beim Leerzeichen, soweit natürlich eins vorhanden ist
      mysql_query("UPDATE adress SET zip='$zip', city='$city' WHERE id='$id'") or die("Kein Update m&ouml;glich");
    }
    mysql_close();
    ?>

    natürlich muss vorher noch in MySQL die Spalte zip angelegt werden, ansonsten sollte es so klappen...

    1. Hello,

      das mit dem Leerzeichen ist eine gute Idee.
      Dann schau Dir mal in MySQL die Funktion substring_index(s,f,n) an

      s = string, der zerlegt werden soll
      f = Zeichen, das gesucht wird
      n = Zahl des Auftretens dieses Zeichens, also hier das erste.

      Deine PLZ lautet dann substring_index(ort," ",1);

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Mit den tipps habt ihr grundsätzlich beide recht
        was aber wenn der stadtname auch noch ein leerzeichen enthält
        zb.: St. Pölten oder so???
        das müsstest du also danach noch abprüfen
        mfg gerhard

        1. was aber wenn der stadtname auch noch ein leerzeichen enthält

          das stimmt, dann würd ich das so machen:

          $a=array();
          $a=explode(" ","$city");
          $zip=$a[0]; <= erster Eintrag ist die PLZ, also kein Leerzeichen enthalten

          $z=1;
          while($a[$z]){
           $city.=$a[$z]." ";
          }
          // Solange ein Wert existiert, soll er in $city eingetragen werden.

          $city=chop($city) // Das letzte Leerzeichen wird hiermit entfernt

          mfg,
          thomas

          1. $z=1;
            while($a[$z]){
            $city.=$a[$z]." ";

            hier kommt natürlich noch ein    $z++;    rein!!!!

            }

          2. Hallo Thomas,

            $z=1;
            while($a[$z]){
             $city.=$a[$z]." ";
            }

            einfacher geht das mit:

            list($plz,$ort) = explode(' ',$cityAusDb,2);

            durch die 2 werden höchstens zwei Elemente zurückgegeben (->http://de3.php.net/explode) und du hast in $plz die Postleitzahl und in $ort den Ort stehen.

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            1. einfacher geht das mit:

              list($plz,$ort) = explode(' ',$cityAusDb,2);

              danke für die info.
              ist nur schwierig, wenn man es einmal gelernt hat, dann was neues zu benutzen...werd mir aber mühe geben!!! ;-)

              mfg,
              thomas

            2. yo,

              einfacher geht das mit:

              list($plz,$ort) = explode(' ',$cityAusDb,2);

              noch einfacher geht es, wenn man wie bereits erwähnt mit einer konstanten länge der postleitzahlen zu tun hat oder aber das leerzeichen gleich in der sql abfrage benutzt, um beides zu trennen. php ist hier überflüssig. nach der stelle des ersten vorkommens eines leerzeichens suchen und dann mit substring teilen.

              Ilja

              1. Hello,

                noch einfacher geht es, wenn man wie bereits erwähnt mit einer konstanten länge der postleitzahlen zu tun hat oder aber das leerzeichen gleich in der sql abfrage benutzt, um beides zu trennen. php ist hier überflüssig. nach der stelle des ersten vorkommens eines leerzeichens suchen und dann mit substring teilen.

                Dafür gibt es substring_index()

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                1. yo,

                  Dafür gibt es substring_index()

                  komme mehr aus der oracle welt. wenn mysql so eine schöne funktion hat, dann ist ja alles butter. auf jeden fall ist php fehl am platz.

                  Ilja

                  1. Hello,

                    Dafür gibt es substring_index()

                    komme mehr aus der oracle welt. wenn mysql so eine schöne funktion hat, dann ist ja alles butter. auf jeden fall ist php fehl am platz.

                    Dafür hat Oracle andere schöne Sachen ;-)

                    Harzliche Grüße aus http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
              2. Hallo Ilja,

                list($plz,$ort) = explode(' ',$cityAusDb,2);
                noch einfacher geht es, wenn man wie bereits erwähnt mit einer konstanten länge der postleitzahlen zu tun hat oder aber das leerzeichen gleich in der sql abfrage benutzt, um beides zu trennen. php ist hier überflüssig.

                das ist mir auch klar - ich wollte Thomas nur zeigen, dass das was er in php geschrieben hat sich auch einfacher lösen lässt. :-)

                Grüße aus Nürnberg
                Tobias

                --
                Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        2. hi,

          Mit den tipps habt ihr grundsätzlich beide recht
          was aber wenn der stadtname auch noch ein leerzeichen enthält
          zb.: St. Pölten oder so???

          ist doch wurscht - ich möchte postleitzahl_leerzeichen_stadtnamemitbeliebigvielenleerzeichen zerlegen - also interessiert mich nur genau das erste leerzeichen, das zwischen PLZ und stadtname.

          gruß,
          wahsaga

          --
          I'll try being nicer if you'll try being smarter.
  4. Hallo Maresa,

    Dummerweise sind in meiner Tabelle jedoch schon mehrere Hundert Datensätze vorhanden, welche ich nun anpassen muss. Natürlich könnte ich dies manuell machen, erscheint mir jedoch zu umständlich.
    Frage: Kann ich die bestehenden Datensätze auch mit einer SQL Query automatisiert ändern? Wenn ja, wie muss dies query lauten.

    kannst du sicher sein, dass du *immer* eine 5-stellige Postleitzahl hast? Wenn ja, kannst du es mal mit diesem Query versuchen:

    UPDATE <tabelle> SET plz = SUBSTRING(stadt,1,5), stadt = SUBSTRING(stadt,6);

    - oder du verwendest gleich http://opengeodb.de/

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|