Mittels Erdberechnung + Ort Angebot wählen

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

  • Mittels Erdberechnung + Ort Angebot wählen

    Hallo,

    ich habe ein kleines Problem bei meiner SQL Abfrage zuerst erstmal die Abfrage
    PHP-Code:
    SELECT ortplz,(".$earthRadius."*SQRT(2*(1-cos(RADIANS(kob))*cos(".$breite.")*(sin(RADIANS(kol))*
    sin(".$laenge.")+cos(RADIANS(kol))*cos(".$laenge."))-sin(RADIANS(kob))*sin(".$breite.")))) AS Distance 
    FROM karte 
    WHERE 
    ".$earthRadius."*
    SQRT(2*(1-cos(RADIANS(kob))*cos(".$breite.")*(sin(RADIANS(kol))*sin(".$laenge.")+cos(RADIANS(kol))*
    cos(".$laenge."))-sin(RADIANS(kob))*sin(".$breite."))) <= ".$umkreis." 

    AND
    (
    SELECT 
        lsn_ang
    .ortlsn_ang.plzkarte.ortkarte.plzkarte.kolkarte.koblsn_arts.ID,
        
    lsn_arts.festpreislsn_arts.maskelsn_arts.zukatlsn_arts.art_kurz,
        
    lsn_arts.art_longlsn_kat.IDlsn_ang.preis_angebotlsn_ang.preis_normallsn_kat.longlsn_kat.tae
        FROM 
        lsn_ang lsn_ang
    karte kartelsn_arts lsn_artslsn_kat lsn_kat
        where 

        lsn_ang
    .plz karte.plz
        
    AND lsn_kat.ID lsn_arts.zukat
        
    AND lsn_ang.zuart lsn_arts.ID
        
    AND lsn_ang.online 1
        
    AND lsn_kat.SHOP 'L'
        
    )
        
    AND 
    ORDER BY Distance 
    Leider bekomme ich immer den Fehler
    #1241 - Operand should contain 1 column(s)
    Leider finde ich den Fehler nicht, kann eigentlich (hoffentlich) nichts gravierendes sein.

    Bis zur Where soll er nur die Distancen ausrechnen (Mittels der Erdkrümmung und Geo Koor.)

    In der zweiten Select soll er dann das passende Angebot rausfiltern.
    Beide Select ansich funktionieren, zusammen leider nicht.
    Kann vielleicht jemand mal drüber gucken? Und mir einen Tipp geben?
    Vielen Dank

  • #2
    Re: Mittels Erdberechnung + Ort Angebot wählen

    PHP-Code:
    WHERE ...
    AND
    (
    SELECT ...)
    AND 
    ORDER BY Distance 
    Ist doch irgendwie Käse, oder meinst du nicht??

    Kommentar


    • #3
      stimmt du hast recht, das AND sollte nicht sein, aber die Select müsste eigentlich funktionieren...

      Es müsste doch gehn, dass ich eine weitere SELECT in die WHERE baue oder nicht ?

      Der obere Teile bestimmt die Orte mit den Distanzen und leider bekomme ich unsere Angebote dort nicht hineine.

      Normalerweise müsste ich dann vergleichen ... ORT mit ORT ..

      aber es wird doch wahrscheinlich auch nicht funktionieren wenn ich es so mache

      PHP-Code:
      ort = (SELECT 
          lsn_ang
      .ortlsn_ang.plzkarte.ortkarte.plzkarte.kolkarte.koblsn_arts.ID,
          
      lsn_arts.festpreislsn_arts.maskelsn_arts.zukatlsn_arts.art_kurz,
          
      lsn_arts.art_longlsn_kat.IDlsn_ang.preis_angebotlsn_ang.preis_normallsn_kat.longlsn_kat.tae
          FROM 
          lsn_ang lsn_ang
      karte kartelsn_arts lsn_artslsn_kat lsn_kat
          where 
          lsn_ang
      .plz karte.plz
          
      AND lsn_kat.ID lsn_arts.zukat
          
      AND lsn_ang.zuart lsn_arts.ID
          
      AND lsn_ang.online 1
          
      AND lsn_kat.SHOP 'L'
          

      Oder geht das garnicht?

      Kommentar


      • #4
        Ich persönlich verstehe nicht mal was du da raus haben willst durch den Query...

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Ich gebe zu es ist auch nicht leicht.

          ich habe eine Tabelle mit folgenden Daten

          Kol = Längengrad
          Kob = Breitengrad
          plz = Postleitzahl
          ort = die Orte

          Diese Tabelle heisst Karte


          Der Teil Berechnet die richtigen Koortdinaten von einer anderen Tabelle:

          PHP-Code:
          SELECT ortplz,(6367.41*SQRT(2*(1-cos(RADIANS(kob))*cos(0.89461822247829)*(sin(RADIANS(kol))* sin(0.12474027120029)+cos(RADIANS(kol))*cos(0.12474027120029))-sin(RADIANS(kob))*sin(0.89461822247829)))) AS Distance 
          FROM karte 
          WHERE 6367.41
          SQRT(2*(1-cos(RADIANS(kob))*cos(0.89461822247829)*(sin(RADIANS(kol))*sin(0.12474027120029)+cos(RADIANS(kol))* cos(0.12474027120029))-sin(RADIANS(kob))*sin(0.89461822247829))) <= 50 ORDER BY Distance 

          Die Ausgabe sieht folgendermaßen aus bei dieser Abfrage

          ort plz Distance
          Düsseldorf 40212 0.6805006935835
          Düsseldorf 40211 0.78988133690809
          Düsseldorf 40215 0.8733307983443
          Düsseldorf 40213 1.3089818727118
          Düsseldorf 40227 1.3104736434284
          Düsseldorf 40233 1.4096546047075
          Düsseldorf 40217 1.5048117182945
          usw.

          bisher sieht es so aus, dass ich die ausgegebenen Orte in einen Array speichere

          und dann folgende Abfrage benutze

          PHP-Code:
          SELECT 
              lsn_ang
          .ortlsn_ang.plzkarte.ortkarte.plzkarte.kolkarte.koblsn_arts.ID,
              
          lsn_arts.festpreislsn_arts.maskelsn_arts.zukatlsn_arts.art_kurz,
              
          lsn_arts.art_longlsn_kat.IDlsn_ang.preis_angebotlsn_ang.preis_normallsn_kat.longlsn_kat.tae
              FROM 
              lsn_ang lsn_ang
          karte kartelsn_arts lsn_artslsn_kat lsn_kat
              where 
              
          (";
              
          $globaler_ort = array_unique($globaler_ort);
              foreach(
          $globaler_ort as $ort){
              
          $sql_angebote .= "lsn_ang.ort '".$ort."' or "; }
              
          $sql_angebote = substr($sql_angebote,0,strlen($sql_angebote)-3);
              
          $sql_angebote .=    ")
              AND 
          lsn_ang.plz karte.plz
              
          AND lsn_kat.ID lsn_arts.zukat
              
          AND lsn_ang.zuart lsn_arts.ID
              
          AND lsn_ang.online 1
              
          AND lsn_kat.SHOP 'L'
              
          GROUP BY lsn_ang.ort 
          Nur ehrlich ... das ist scheisse lahm 3 -5 Sekunde und das geht nicht.
          Ich denke das man das mit SQL direkt und schneller machen kann, deshalb dachte ich das die obere Abfrage funktionieren könnte, dann könnte ich direkt die Angebote den Orten zuweisen.

          Kommentar


          • #6
            Warum machst du nicht einfach einen JOIN?

            Alternativ ein SUBSELECT mit
            SELECT * FROM lsn_ang WHERE
            lsn_ang.ort IN (<dein 1. select>)

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              weil es wahrscheinlich nicht geht, du musst dir vorstellen die Ausgebe sind ca. 10 orte ...
              Aber vielleicht funktioniert es ja, ich teste es und melde mich dann...

              Also ich habe es geteste, die Idee ist echt gut, hätte mir dadurch viel arbeit ersparrt ...

              Leider bekomme ich folgende Fehlermeldung bei der Abfrage

              PHP-Code:
              SELECT FROM lsn_ang 
              WHERE lsn_ang
              .ort 
              IN 
              SELECT ortplz,(6367.41*SQRT(2*(1-cos(RADIANS(kob))*
              cos(0.89461822247829)*(sin(RADIANS(kol))* sin(0.12474027120029)+cos(RADIANS(kol))*
              cos(0.12474027120029))-sin(RADIANS(kob))*
              sin(0.89461822247829)))) AS Distance FROM karte WHERE 6367.41SQRT(2*(1-cos(RADIANS(kob))*cos(0.89461822247829)*
              (
              sin(RADIANS(kol))*
              sin(0.12474027120029)+cos(RADIANS(kol))* cos(0.12474027120029))-sin(RADIANS(kob))*
              sin(0.89461822247829))) <= 50 ORDER BY Distance 

              #1241 - Operand should contain 1 column(s)

              Also irgend eine Spalte findet der nicht.
              Zuletzt geändert von none; 29.09.2007, 23:07.

              Kommentar


              • #8
                Meine Güte, was ist so schwer daran das Problem in Teilprobleme zu zerlegen?
                Kürze den Query bis er geht und bau dann schrittweise auf um zu gucken was genau den Fehler verursacht.


                [edit]
                Der Fehler ist, dass du 3 Spalten im SUBSELECT angibst - wo soll der denn bitte da gucken?! Du musst genau EINE Spalte angeben!!!
                Zuletzt geändert von ghostgambler; 29.09.2007, 21:14.

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar


                • #9
                  Danke für den Tip!

                  Ich weiss wo das prob ist, aber ich brauche die Daten aus der Select (ich brauch sowohl plz, als auch den Ort und die Distanze)
                  Deshalb kann ich nichts weg kürzen.

                  kann ich in der in Select vielleicht mehrere sachen vergleichen
                  in select lsn_ang.ort, lsn_ang.plz, karte.plz, karte.ort oder so ähnlich, weil die zweite Select muss so bleiben damit sie funktioniert

                  Kommentar


                  • #10
                    Ich weiss wo das prob ist, aber ich brauche die Daten aus der Select (ich brauch sowohl plz, als auch den Ort und die Distanze)
                    Wäre doch sinnvoller die in diesem Fall extra abzufragen oder? Ach und Code umbrechen bitte.
                    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                    Kommentar


                    • #11
                      Hatte ich vorher und dann hab ich sie im array gespeichert und dann in der SQL abfrage mittels foreach ausgegeben

                      PHP-Code:
                      ELECT 
                          lsn_ang
                      .ortlsn_ang.plzkarte.ortkarte.plzkarte.kolkarte.koblsn_arts.ID,
                          
                      lsn_arts.festpreislsn_arts.maskelsn_arts.zukatlsn_arts.art_kurz,
                          
                      lsn_arts.art_longlsn_kat.IDlsn_ang.preis_angebotlsn_ang.preis_normallsn_kat.longlsn_kat.tae
                          FROM 
                          lsn_ang lsn_ang
                      karte kartelsn_arts lsn_arts
                      lsn_kat lsn_kat
                          where 
                          
                      (";
                          
                      $globaler_ort = array_unique($globaler_ort);
                          foreach(
                      $globaler_ort as $ort){
                          
                      $sql_angebote .= "lsn_ang.ort '".$ort."' or "; }
                          
                      $sql_angebote = substr($sql_angebote,0,strlen($sql_angebote)-3);
                          
                      $sql_angebote .=    ")
                          AND 
                      lsn_ang.plz karte.plz
                          
                      AND lsn_kat.ID lsn_arts.zukat
                          
                      AND lsn_ang.zuart lsn_arts.ID
                          
                      AND lsn_ang.online 1
                          
                      AND lsn_kat.SHOP 'L'
                          
                      GROUP BY lsn_ang.ort 

                      Kommentar


                      • #12
                        Warum nicht einfach einen JOIN?
                        Das ist nicht nur einfacher sondern geht auch schneller...

                        Code:
                        SELECT 
                            lsn_ang.ort, lsn_ang.plz, karte.ort, karte.plz, karte.kol, karte.kob, lsn_arts.ID,
                            lsn_arts.festpreis, lsn_arts.maske, lsn_arts.zukat, lsn_arts.art_kurz,
                            lsn_arts.art_long, lsn_kat.ID, lsn_ang.preis_angebot, lsn_ang.preis_normal, lsn_kat.long, lsn_kat.tae,
                            [COLOR=orangered](".$earthRadius."*SQRT(2*(1-cos(RADIANS(kob))*cos(".$breite.")*(sin(RADIANS(kol))*
                        sin(".$laenge.")+cos(RADIANS(kol))*cos(".$laenge."))-sin(RADIANS(kob))*sin(".$breite.")))) AS Distance[/COLOR] 
                            FROM 
                            lsn_ang lsn_ang, karte karte, lsn_arts lsn_arts, lsn_kat lsn_kat
                            [COLOR=orangered]INNER JOIN karte karte ON lsn_kat.ort = karte.ort[/COLOR] 
                            where 
                        
                            lsn_ang.plz = karte.plz
                            AND lsn_kat.ID = lsn_arts.zukat
                            AND lsn_ang.zuart = lsn_arts.ID
                            AND lsn_ang.online = 1
                            AND lsn_kat.SHOP = 'L'
                        [COLOR=orangered]ORDER BY Distance[/COLOR]

                        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                        Wie man Fragen richtig stellt

                        Kommentar


                        • #13
                          Auf den Ansatz hätte ich auch kommen können, danke erstmal dafür
                          musste allerdings Änderungen vornehmen, da es leider einen Fehler verursachte bei der InnerJoin

                          #1066 - Not unique table/alias: 'karte'

                          Also habe ich die Innerjoin raus gelassen und es funktioniert... l


                          PHP-Code:
                           SELECT lsn_ang.ortlsn_ang.plzkarte.ortkarte.plz
                          karte.kolkarte.koblsn_arts.IDlsn_arts.festpreis
                          lsn_arts.maskelsn_arts.zukatlsn_arts.art_kurz
                          lsn_arts.art_longlsn_kat.IDlsn_ang.preis_angebotlsn_ang.preis_normallsn_kat.longlsn_kat.tae,
                           ( 
                          6367.41 SQRT* ( cosRADIANSkob ) ) 
                          cos0.89461822247829 ) * ( sinRADIANSkol ) ) * sin0.12474027120029 ) + cosRADIANSkol ) ) * 
                          cos0.12474027120029 ) ) - sinRADIANSkob ) ) * 
                          sin0.89461822247829 ) ) ) ) AS Distance
                          FROM lsn_ang lsn_ang
                          karte kartelsn_arts 
                          lsn_arts
                          lsn_kat lsn_kat
                          WHERE lsn_ang
                          .plz karte.plz
                          AND lsn_kat.ID lsn_arts.zukat
                          AND lsn_ang.zuart lsn_arts.ID
                          AND lsn_ang.online =1
                          AND lsn_kat.SHOP 'L'
                          ORDER BY Distance 
                          Leider ist die Performance sehr sehr schlecht
                          PHPmyAdmin meldet
                          Zeige Datensätze 0 - 29 (2.079 insgesamt, die Abfrage dauerte 61.6757 sek.)

                          Und das geht echt nicht, jetzt habe ich erfolglos versucht die zweite Berechnung mit einzubeziehen

                          PHP-Code:
                          WHERE ".$earthRadius."*SQRT(2*(1-cos(RADIANS(kob))*cos(".$breite.")*(sin(RADIANS(kol))*
                              
                          sin(".$laenge.")+cos(RADIANS(kol))*    cos(".$laenge."))-sin(RADIANS(kob))*sin(".$breite."))) <= ".$umkreis." 
                          Leider ist mir das auch nicht gelungen, woran kann es liegen das es so lannnge dauert ?

                          [edit]
                          Ich habe es ans laufen bekommen mit folgendem CODE
                          PHP-Code:
                          SELECT lsn_ang.ortlsn_ang.plzkarte.ortkarte.plzkarte.kolkarte.koblsn_arts.IDlsn_arts.festpreis,
                          lsn_arts.maskelsn_arts.zukatlsn_arts.art_kurz
                          lsn_arts.art_longlsn_kat.IDlsn_ang.preis_angebotlsn_ang.preis_normallsn_kat.longlsn_kat.tae
                          6367.41 SQRT* ( cosRADIANSkob ) ) 
                          cos0.89461822247829 ) * ( sinRADIANSkol ) ) * sin0.12474027120029 ) + cosRADIANSkol ) ) * cos0.12474027120029 ) ) - sinRADIANSkob ) ) * sin0.89461822247829 ) ) ) ) AS Distance
                          FROM lsn_ang lsn_ang
                          karte kartelsn_arts lsn_arts
                          lsn_kat lsn_kat
                          WHERE lsn_ang
                          .plz karte.plz
                          AND lsn_kat.ID lsn_arts.zukat
                          AND lsn_ang.zuart lsn_arts.ID
                          AND lsn_ang.online =1
                          AND lsn_kat.SHOP 'L'
                          AND 6367.41 SQRT* ( cosRADIANSkob ) ) 
                          cos0.89461822247829 ) * ( sinRADIANSkol ) ) 
                          sin0.12474027120029 ) + cosRADIANSkol ) ) 
                          cos0.12474027120029 ) ) - sinRADIANSkob ) )
                           * 
                          sin0.89461822247829 ) ) ) <=50
                          ORDER BY Distance 
                          Nur dauert es immernoch
                          Zeige Datensätze 0 - 116 (117 insgesamt, die Abfrage dauerte 1.3569 sek.)
                          Oder ist das in Ordnung? Oder kann man noch optimieren?
                          Zuletzt geändert von none; 30.09.2007, 11:18.

                          Kommentar


                          • #14
                            #1066 - Not unique table/alias: 'karte'
                            Du kannst natürlich nicht zweimal karte benutzen, erstere muss raus:
                            Code:
                            FROM 
                            lsn_ang lsn_ang, [b]karte karte[/b], lsn_arts lsn_arts, lsn_kat lsn_kat
                            INNER JOIN [b]karte karte[/b] ON lsn_kat.ort = karte.ort 
                            where
                            Leider ist die Performance sehr sehr schlecht
                            Hast du auch schonmal ausprobiert warum, einzelne Query teile rausgenommen?
                            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                            Kommentar


                            • #15
                              EXPLAIN <query>
                              und Ausgabe posten~

                              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                              Wie man Fragen richtig stellt

                              Kommentar

                              Lädt...
                              X