Ankündigung

Einklappen
Keine Ankündigung bisher.

Sql group by

Einklappen

Neue Werbung 2019

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

  • Sql group by

    Hi Leute

    Ich habe gerade ein Problem worauf ich noch keine Lösung gefunden habe obwohl sie mir so logisch vor kam und doch nicht das gewünschte Ergebnis bringt:

    Der User baut Gebäude welche mit ihrem Namen und der gebauten stufe per INSERT in die DB geschrieben werden (Funktioniert alles prima).
    Nun bin ich an Hand der Ressourcen produzierenden Gebäude dabei eine Rohstoff Tick Formel zu basteln und benötige dazu die zuletzt gebaute Stufe des jeweiligen Gebäude.

    Das Gruppieren der Gebäude zum jeweiligen User funktioniert auch, nur bekomme ich anstatt die letzten Stufen zu den Gebäuden, nur die erst gebauten Stufen und finde die Lösung einfach nicht, obwohl es mir so eigentlich logisch erschien.

    Würde mich sehr über einen Denkanstoß von euch freuen.

    PHP-Code:
    public function ressourcenGebaeudeStufen(){

            
    $db = new Datenbank();

            
    $sql "SELECT `gebaeude_name`, `stufe` FROM `gebaeude` WHERE `user_name` = ? GROUP BY `gebaeude_name` ORDER BY `stufe` DESC";

            
    $stmt $db->db->prepare($sql);
            
    $stmt->bind_param("s"$this->user_name);
            
    $stmt->execute();

            
    $result $stmt->get_result();
            
    $stmt->close();

            while(
    $row $result->fetch_object()){

                
    $this->gebaeude_name $row->gebaeude_name;
                
    $this->gebaeude_stufe $row->stufe;

                echo 
    "<pre> ".$this->gebaeude_name." , ".$this->gebaeude_stufe." </pre>";
            }



            
    $db->db->close();
        } 
    EnergieBaum , 1
    Handelshaus , 1
    Holzfarm , 1
    Lehmgrube , 1


    LG

    Ascalon

  • #2
    Wenn du GROUP BY nutzt, muss jedes Feld im SELECT entweder aggrgiert oder gruppiert sein. Das ist bei dir nicht der Fall (stufe).
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Du meinst das ich die stufe auch mit bei GROUP BY hinzufügen muss ? Wenn ich das mache, bekomme ich eine Ausgabe, als hätte ich die Abfrage ohne GROUP BY gemacht .. stehe gerade aufm Schlauch, zumal ich nun auch erst mit solchen Abfragen angefangen habe, da ich sie sonst noch nie gebraucht hatte ^^.

      PHP-Code:
      $sql "SELECT `gebaeude_name`, `stufe` FROM `gebaeude` WHERE `user_name` = ? GROUP BY `gebaeude_name`, `stufe` ORDER BY `stufe` DESC"
      Holzfarm , 8
      Holzfarm , 7
      Holzfarm , 6
      EnergieBaum , 6
      Holzfarm , 5
      EnergieBaum , 5
      Holzfarm , 4
      EnergieBaum , 4
      Lehmgrube , 4
      Holzfarm , 3
      Lehmgrube , 3
      EnergieBaum , 3
      Holzfarm , 2
      Lehmgrube , 2
      EnergieBaum , 2
      Handelshaus , 2
      Lehmgrube , 1
      EnergieBaum , 1
      Holzfarm , 1
      Handelshaus , 1

      Kommentar


      • #4
        zuletzt gebaute stufe des jeweiligen gebäude.
        versuch mal sowas:

        PHP-Code:
        $sql "

        SELECT
            `gebaeude_name`, MAX(`stufe`)

        FROM
            `gebaeude`

        WHERE
            `user_name` = ?

        GROUP BY
            `gebaeude_name`

        "


        EDIT:
        Wenn du die Namen der Gebäude so als Text wirklich in der DB hast, verstößt du gegen die Normalisierungsregeln. Lies dich da mal ein in das Thema.

        LG
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          PHP-Code:
          $sql "SELECT `gebaeude_name`, MAX(`stufe`) AS stufe FROM `gebaeude` WHERE `user_name` = ? GROUP BY `gebaeude_name`"
          EnergieBaum , 5
          Handelshaus , 3
          Holzfarm , 2
          Lehmgrube , 2

          Vielen lieben Dank für die Hilfe, genau so wollte ich es und bin wieder ein stückchen schlauer ^^

          Kommentar


          • #6
            ich lerne immer weiter und mehr.. vor wenigen jahren, als ich angefangen habe, war ich froh das ich ein hallo auf den bildschirm bekommen habe xD .. dann habe ich mich mit dem function urwald rumgeärgert und angefangen mir oop beizubringen. als ich froh war, daß ich es endlich geschnallt hatte, habe ich jede menge müll klassen erstellt, die nicht wieder verwendbar waren.. nun bin ich dahin gehend auch schon soweit, daß ich meine klassen weiter verwenden kann und auch habe ich nebenbei dann noch einiges mit ajax gemacht, bzw mir javascript (jquery) soweit noch angeeignet. fortschritte sind also deutlich da und sie werden größer .

            nun bastel ich halt an einem kleinen browserspiel rum um dann auch wirklich alles erlernte einzusetzen und weitere probleme dann zu lösen bzw weiter zu lernen ^^

            Kommentar


            • #7
              Na klingt doch gut.. Dann - gleich mal berücksichtigen - schau dir noch JOINS und Normalisierung als Stichwort an.
              http://www.peterkropff.de/site/mysql/normalisierung.htm

              Zitat von hausl Beitrag anzeigen
              EDIT:
              Wenn du die Namen der Gebäude so als Text wirklich in der DB hast, verstößt du gegen die Normalisierungsregeln. Lies dich da mal ein in das Thema.
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                ja ich weiß, auf der sql seite muss ich auch noch einiges lernen, da habe ich bisher nur mit INSERT , SELECT , DELETE und UPDATE gearbeitet, sonst erstmal auf der programmier technischen seite geschaut das ich klar komme xD

                Kommentar


                • #9
                  achso, meinst auch den aufbau der db, damit man sie mit JOIN weiter verwenden kann.. auch damit muss ich mich in zukunft noch beschäfftigen ^^.. bin schon froh, daß ich so weit bin, wie es momentan ist und ich schon ganz hübsche projekte umsetzen kann ^^

                  Kommentar


                  • #10
                    ich weiß wahrscheinlich warum du das thema angeschnitten hast ^^.. sicherlich wegen dem user_name ^^ aber habe die datenbank schon einigermaßen aufgeteilt.. die user daten, sind auch unter user, dann gebaeude, ressourcen, ressourcen_tick usw nur habe ich in jeder tabelle neben der id dann auch den user_name, damit ich halt direkt nachvollziehen kann, was zu wem gehört. ist für mich momentan noch am übersichtlichsten auch wenn es bestimmt nicht die schönste lösung ist

                    Kommentar


                    • #11
                      Eigentlich wegen den Gebäudenamen die du direkt im Query hast. Da sollte eigentlich noch ein JOIN sein auf eine Tabelle Gebäude, wo du auf die Gebäude dann mittels Fremdschlüssel referenzierst. So hast du ganz viele Redundanzen, etc.. Im Link oben dazu steht mehr.
                      The string "()()" is not palindrom but the String "())(" is.

                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        ach das meinst du, ja.. den jeweiligen gebäude namen gebe ich halt beim bau auftrag mit dazu und wie gesagt, mit JOIN usw werd ich mich in der zukunft dann auch noch beschäfftigen, jetzt wo ich einigermaßen gute klassen schreiben kann, kann man sowas dann auch ganz gut verbessern und optimieren werde ich eh immer weiter, wenn ich bessere lösungen kenne ^^

                        Kommentar


                        • #13
                          Denk aber dran.. Du musst dann die DB umbauen, dh auch viele Abfragen ergänzen/anpassen. Also besser gleich DB-Design richtig, dann ist gut. Oder halt dann fürs nächste Projekt.
                          The string "()()" is not palindrom but the String "())(" is.

                          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                          PHP.de Wissenssammlung | Kein Support per PN

                          Kommentar


                          • #14
                            jup, mal sehen ob ich es für dieses projekt schon umsetze oder erstmal bissel mit dem erlernten rumspiele und auf dem feld erstmal noch weiter lerne bevor ich mich dann der db richtig widme

                            Kommentar

                            Lädt...
                            X