Vorgehensweise Plz suche

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Vorgehensweise Plz suche

    Bin am überlegen wie ich vorgehe.
    Also ich habe eine Tabelle, wo Einträge, mit der dazugehörigen Postleitzahl, vorhanden sind.
    Zum Beispiel:
    PHP-Code:
    id  datum  kunde  tel  tel2  ort  plz  strasse  hausnummer 
    Ebenso habe ich eine 2.te tabelle, wo sämtliche Orte mit dazugehörigen Postleitzahlen und Koordinaten drinne stehen. (ganz deutschland)
    PHP-Code:
    id ort plz laengengrad breitengrad ... 

    Nun möchte ich aus der 1.ten Tabelle, mit allen Einträgen, nur diejenigen raussuchen, die einen bestimmten umkreis meiner Wahl entsprechen.

    Ich möchte zum Beispiel alle Einträge raussuchen, die im Umkreis von 30 Kilometer von 24962 liegen.

    Muß ich beim speichern meiner Einträge, erst die 2.te Tabelle nach den Koordinaten fragen und die Koordinaten dann mit eintragen, oder reicht es, wenn in der 1.ten Tabelle die Plz drinne steht und ich die 2te Tabelle nur zur hilfe nehme. Ich wüßte dann nähmlich nicht wie ich das lösen sollte?

    Hoffe Ihr versteht was ich meine?
    Zuletzt geändert von martinm79; 21.04.2005, 18:13.
    Gut geraten ist halb gewußt.

  • #2
    mittag!

    also wenn ich das richtig sehe, dann willst du bei einer suche zum beispiel die PLZ 24962 angeben und das suchergebnis soll dir dann alle einträge aus tabelle 1 wiedergeben, die im umkreis von 30 km von 24962 liegen?

    wenn das so ist, dann würde ich wie folgt vorgehen:


    erstmal alle daten aus tabelle 2 in ein assoziatives array. (nenne ich mal $orte)
    dann holst du dir die laengen und breitengrad aus der tabelle, die zum eintrag 24962 liegen ( nenne ich mal $breite und $laenge )

    dann suchst du daraus die PLZ die 30 km davon wegliegen:

    PHP-Code:
    $j=0;
    for(
    $i=0;$i<count($orte);$i++)
    {
          if((
    acos(sin($breite) * sin($orte[$i]["breite"]) + cos($breite) *
              
    cos($orte[$i]["breite]) *   
              cos(min(
    $laenge-$orte[$i]["laenge"], 360-(§laenge-$orte[$i]["laenge"])))) *111)<=30)   
    // berechnen des abstandes der beiden orte 
    {
       
    $neueorte[$j]=$orte[$i]
        
    $j++;
    };
       
    };

    // code ist nicht getestet ... 
    in dem array $neueorte hast du dann ja alle PLZ die im umkreis von 30 km um 24962 liegen.

    dann holst du dir alle alle daten aus tabelle 1 bei denen die PLZ in dem array 24962 liegen...

    hoffe das reicht und das war auch das was du meintest

    cya
    Dioony
    Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung.
    [Albert Einstein

    Kommentar


    • #3
      Original geschrieben von dioony
      dann holst du dir die laengen und breitengrad aus der tabelle,
      Entschuldigt bitte, ihr haltet mich jetzt bestimmt für dumm, aber:

      Wie sind denn diese Daten in der Tabelle gespeichert? Wo bekomm ich die her?

      MfG
      .
      .http://www.Nightkillerz.de
      .

      Kommentar


      • #4
        @dioony
        also wenn ich das richtig sehe, dann willst du bei einer suche zum beispiel die PLZ 24962 angeben und das suchergebnis soll dir dann alle einträge aus tabelle 1 wiedergeben, die im umkreis von 30 km von 24962 liegen?
        Ja genau.

        in dem array $neueorte hast du dann ja alle PLZ die im umkreis von 30 km um 24962 liegen.

        dann holst du dir alle alle daten aus tabelle 1 bei denen die PLZ in dem array 24962 liegen...

        hoffe das reicht und das war auch das was du meintest
        Ja, genau das wollt ich wissen. Danke.


        Hab da nur noch eine frage...passt jetzt eigendlich zum thema mysql aber ich frag trotzdem mal.
        Weil in dem array können doch, wenn ich zum beispiel ein größeren umkreis habe, über 100 orte sein.
        Wie gestallte ich denn diese abfrage?

        Mit einer foreach schleife das array durchgehen um die werte immer
        PHP-Code:
        (plz '".$wert."' OR) 
        an der WHERE abfrage ranhängen? Die sql abfrage wäre ja dann riesig?

        @jupp.s Suche mal hier im forum nach plz oder soo.... Da ist irgendwo ein interessanter link.
        Gut geraten ist halb gewußt.

        Kommentar


        • #5
          Würde es dir denn etwas ausmachen, statt der Orte im UmKREIS, die im UmQUADRAT zu erhalten? Das ginge nämlich bei weitem einfacher.
          Dazu ziehst du einfach alle Orte aus der DB, deren Längen- und Breitengrad jeweils nicht zu weit abweichen.

          SELECT a.* FROM a, b WHERE a.plz = b.plz
          AND b.laengengrad BETWEEN $minlg AND $maxlg
          AND b.breitengrad BETWEEN $minbg AND $maxbg

          Die mins und maxs sind die Länge/Breite eines Ortes plus halbe Seitenlänge des Quadrats.

          Wie gesagt: Nicht korrekt, vielleicht auch nicht schneller, aber viel einfacher.

          Kommentar


          • #6
            @ onemorenerd Wäre vielleicht eine möglichkeit, aber ich möchte es doch genauer haben. Und das berechnen der beiden orte ist ja nicht meine frage gewesen, bzw. problem. Sondern Weil ich die ergebnisse aus der einen tabelle mit dem inhalt aus der anderen vergleichen muß. Muß mal nochmal im mysql buch nachlesen, wie ich die beiden verbinden kann. Irgendwo hatte ich schon mal sowas gelesen.

            Aber danke für die Hilfe.
            Gut geraten ist halb gewußt.

            Kommentar


            • #7
              Ohm ich blicks grad nicht mehr:
              Willst du (a) zu einem Ort, dessen PLZ, Längen- und Breitengrad du kennst, alle Orte haben, die nicht weiter als x km entfernt sind?
              Oder (b) nur alle, die nicht weiter als x km entfernt sind und die gleiche PLZ haben?
              Oder gar nicht die Orte sondern die Kunden aus den Orten aus a oder b?

              Kommentar


              • #8
                @ onemorenerd keines von den beiden.
                Wie ich die orte ermittel, die im umkreis liegen, weiß ich ja. Aber wie ich die abfrage gestallte, das er die passenden einträge finde, wußte ich noch nicht.

                Es müßte mit einer Unterabfrage gehen. Ich bin aber noch am testen.

                PHP-Code:
                SELECT *
                FROM Tabelle1
                WHERE Tabelle1
                .Eine_Spalte =
                (
                SELECT Eine_Andere_Spalte
                FROM Tabelle2
                WHERE Eine_Andere_Spalte 
                Ein_Wert
                Gut geraten ist halb gewußt.

                Kommentar


                • #9
                  SELECT * FROM a WHERE plz IN (SELECT plz FROM b WHERE ....)

                  Kommentar


                  • #10
                    Aha.... hab ich noch nicht getestet, aber sieht nett aus.
                    Bei 300 km umkreis kann da zwar ne menge an plz zusammen kommen, aber das dürfte ja dann keine rolle spielen,oder?
                    Gut geraten ist halb gewußt.

                    Kommentar


                    • #11
                      Naja wenn der Bezugspunkt mitten in Deutschland und der Umkreis 1000 km ist, liefert dir die innere SELECT-Abfrage alle dt. PLZ's. Aber das Problem hast du mit jeder Abfrage, wenn deine Applikation nicht zuvor schon etwas "Logik" reinbringt und zum Beispiel den Umkreis begrenzt.

                      Allgemein spielt es schon eine Rolle, wie groß das Ergebnis der inneren Abfrage ist. Ich nehme an, die Elemente im IN() sollten möglichst nach dem Kriterium b.plz sortiert sein und Tabelle a einen Index a.plz haben, um möglichst schnell zu sein. Ob das was bringt, kannst du mit EXPLAIN ... rausfinden.

                      Kommentar


                      • #12
                        Naja... von 1000 km war auch nicht die rede.
                        Aber danke.
                        Gut geraten ist halb gewußt.

                        Kommentar

                        Lädt...
                        X