Das Deutsche PHP Forum

Einklappen
Keine Ankündigung bisher.

Das Deutsche PHP Forum

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

  • Abfrage erstellen

    Hi, ich kenne mich noch nicht sehr gut aus mir sql. Daher meine Frage.
    Ich will eine Abfrage erstellen in der auch gleichzeitig eine Berechnung durchgeführt wird.

    Ich habe in meiner Datenank verschiedene koordinaten gespeichert (99x99). Nun habe ich ein formular wo ich den ausgangswert und die maximale entfernung eingebe.
    Die Entfernung berechne ich bisher mit php jedoch wollte ich die berechnung ganz gerne über sql machen.

    In php sieht die Berechnung im moment so aus

    PHP-Code:
    function entfernung($start1$start2$ziel1$ziel2) {
        
    $a $start1 $ziel1;
        if(
    $start<0) {
            
    $start $start * -1;
        }
        
    $b $start2 $ziel2;
        if(
    $ziel<0) {
            
    $ziel $ziel * -1;
        }
        
    $a $a $a;
        
    $b $b $b;
        
    $entfernung =  $a $b;
        
    $entfernung sqrt($entfernung);
        
    $entfernung round($entfernung 2);
        return 
    $entfernung;

    Kann mir jemand behinflich sein das in sql umzusetzen?

  • #2
    Klar. Den ersten Versuch solltest allerdings Du unternehmen.

    Tipp: Fass die Formel zusammen, math. Funktion bietet SQL ja.

    c = wurzel aus a quadrat + b quadrat.

    Mit stored procedures könntest Du sogar eine ähnliche Funktion wie oben definieren. Wobei die -1 Tests eher in den WHERE Clause gehören.
    --
    ^^ O.O
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Also hier mal mein erster Versuch.

      PHP-Code:


      SELECT s
      .allianzs.names.zusatzs.punktes.p_flottep.coords_sysxp.coords_sysyp.coords_planetSqr(
      66 p.coords_sysx ) * ( 66 p.coords_sysx ) + ( 62 p.coords_sysy ) * ( 62 p.coords_sysy )
      ) AS 
      Entfernung
      FROM w3_spieler s
      LEFT JOIN w3_planeten p ON s
      .pk p.spieler_pk
      ORDER BY s
      .name ASC
      LIMIT 0 
      50 
      Haut leider nicht hin.

      Kommentar


      • #4
        „Haut leider nicht hin....“ ist keine sinnvolle Fehlerbeschreibung
        --
        ^^ O.O
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Ok habs nun doch hinbekommen
          Ich hatte bei SQRT nur das T vergessen ^^

          PHP-Code:
              $query sprintf("SELECT s.allianz, s.name, s.zusatz, s.punkte, s.p_flotte, p.coords_sysx, p.coords_sysy, p.coords_planet,
          ROUND(SQRT((" 
          $_POST['x'] . " - p.coords_sysx) * (" $_POST['x'] . " - p.coords_sysx) + (" $_POST['y'] . " - p.coords_sysy) * (" $_POST['y'] . " - p.coords_sysy)), 2) AS Entfernung
                               FROM w3_spieler s
                               LEFT JOIN w3_planeten p ON s.pk=p.spieler_pk
                                %s %s
                                ORDER BY %s %s
                                LIMIT %s , %s"
          ,
                       
          $where,
                       
          implode(" AND "$sop),
                       
          $_SESSION["sort_op"],
                       
          $_SESSION["richtung"],
                       
          $start,
                       
          $_SESSION["proseite"]); 
          Muss ich zwar noch nen bischen was dran ändern aber das wichtigste ist denk ich geschafft.
          Zuletzt geändert von wepse; 21.03.2009, 00:00.

          Kommentar


          • #6
            Glückwunsch! Das sind mir immer die liebsten Boarduser.

            PS: Falls Dir das mal hilft: es gibt auch Variablen in SQL.
            Zuletzt geändert von nikosch; 21.03.2009, 00:57.
            --
            ^^ O.O
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              So hier jetzt mal mein fertiges ergebnis.

              Code:
              SELECT s.allianz, s.name, s.zusatz, s.punkte, s.p_flotte, p.coords_sysx, p.coords_sysy, p.coords_planet, 
              ROUND(SQRT((66 - p.coords_sysx) * (66 - p.coords_sysx) + (62 - p.coords_sysy) * (62 - p.coords_sysy)), 2) AS Entfernung FROM w3_spieler s
              LEFT JOIN w3_planeten p ON s.pk=p.spieler_pk
              WHERE ROUND( SQRT( IF((66- p.coords_sysx ) * ( 66 - p.coords_sysx )<0,( 66 - p.coords_sysx ) * ( 66 - p.coords_sysx )*-1,( 66 - p.coords_sysx ) * ( 66 - p.coords_sysx )) + IF(( 62 - p.coords_sysy ) * ( 62 - p.coords_sysy )<0,( 62 - p.coords_sysy ) * ( 62 - p.coords_sysy )*-1,( 62 - p.coords_sysy ) * ( 62 - p.coords_sysy )) ) , 2 ) < '10'
              ORDER BY s.name ASC
              LIMIT 0 , 50
              PHP-Code:
                  $query sprintf("SELECT s.allianz, s.name, s.zusatz, s.punkte, s.p_flotte, p.coords_sysx, p.coords_sysy, p.coords_planet,
                                    ROUND(SQRT((%s - p.coords_sysx) * (%s - p.coords_sysx) + (%s - p.coords_sysy) * (%s - p.coords_sysy)), 2) AS
                                    Entfernung
                                    FROM w3_spieler s
                                    LEFT JOIN w3_planeten p ON s.pk=p.spieler_pk
                                    %s %s
                                    ORDER BY %s %s
                                    LIMIT %s , %s"
              ,
                           
              $_POST['x'],
                           
              $_POST['x'],
                           
              $_POST['y'],
                           
              $_POST['y'],
                           
              $where,
                           
              implode(" AND "$sop),
                           
              $_SESSION["sort_op"],
                           
              $_SESSION["richtung"],
                           
              $start,
                           
              $_SESSION["proseite"]); 
              Kann ich daran noch etwas verbessern?

              Kommentar


              • #8
                - %d statt %s.

                Ist das eigentlich ein Spiel? Je nach Performance der akt. Berechnung und Anspruch könnte man dann auch die Entfernungen pseudoberechnen (Näherungswert, so eine Art Rasterentfernung: x+y-Korrekturwert).
                --
                ^^ O.O
                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  Ok danke hab ich jetzt getauscht.

                  Es ist nicht direkt ein Spiel, es ist mehr eine Datenbank die als Hilfe dienen soll. In der Datenbank stehen nur informationen zu Spielern und deren Planeten, wo sie sind viele Punkte usw. Mit dieser Funktion will ich die Entfernung zu anderen Spielern anzeigen lassen.
                  Kann dir da grad nicht folgen. Was meinst du mit pseudoberechnen?

                  Kommentar


                  • #10
                    Ah ok, dann ist das vielleicht zu vernachlässigen. Ich könnte mit vorstellen, in einem Browsergame mit vielen Requests könnte der Pythagoras zum Flaschenhals werden. Dann hätte man vielleicht über die Summe von X- und Y-Verschiebung und eine Korrektur eine Art Näherungswert statt der teuren Wurzeloperation berechnen können. War nur so eine Idee.

                    Alternativ könnte man in so einem überschaubaren Raster ja auch die Werte vorherberechnen. Sind ja nicht so viele, wenn man die absoluten Werte für X und Y betrachtet, die vorkommen können. Ich glaube 4900.
                    Zuletzt geändert von nikosch; 21.03.2009, 03:42.
                    --
                    ^^ O.O
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar

                    Lädt...
                    X