Ankündigung

Einklappen
Keine Ankündigung bisher.

Komplexe SQL-Abfrage

Einklappen

Neue Werbung 2019

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

  • Komplexe SQL-Abfrage

    Hallo zusammen,

    ich habe eine Frage zu meiner SQL-Abfrage bzw. ich komm einfach nicht weiter.
    Ich hoffe, dass ihr mir helfen könnt...

    Also, ich habe eine Tabelle "Schnitt" angelegt.
    Hier werden alle Einzelergebnisse gespeichert mit folgenden Spalten:
    hdj, kegler, heimaus, aushilfe, volle, abraumen, fehler.

    Mit folgender Abfrage wird der Gesamt-Schnitt aller "kegler" ausgegeben und absteigend sortiert:
    Code:
    SELECT kegler, AVG(volle) as volle, AVG(abraumen) as abraumen, AVG(fehler) as fehler, count(*) as anzahl FROM Schnitt WHERE hdj = 'Herren' GROUP BY kegler ORDER BY volle+abraumen DESC
    Zur Erklärung noch:
    In der Spalte "hdj" wird nur ein String gespeichert: Herren, Damen oder Jugend.
    In der Spalte "kegler" eben der Name des Keglers.
    In der Spalte "heimaus", ob es ein Heim- oder Auswärtsspiel war.
    In der Spalte "aushilfe" wird nur "ja" oder "nein" gespeichert.

    Ich möchte jetzt zusätzlich noch abfragen, wie oft ein Kegler/Spieler schon in einer anderen Mannschaft ausgeholfen hat.
    Geht das irgendwie in der gleichen Abfrage oben?
    Denn ich speichere die Abfrageergebnisse in einem Array in PHP ab, um sie dann später in einer Tabelle ausgeben zu können.
    Deshalb muss das meiner Meinung nach in der gleichen Abfrage geschehen, damit eben vom Erstplatzierten in der Liste auch seine Aushilfen mitangezeigt werden, oder?

    Ich hoffe, dass ich es einigermaßen verständlich erklären konnte...
    Vielen Dank schon mal im Voraus.

    MfG, cg710

  • #2
    Hallo, willkommen im Forum.

    Wenn du dich zu den Themen Subselects und Joins einliest, solltest du dein Vorhaben recht schnell umsetzen können.

    Längere Queries in einer einzelnen Zeile gepostet sind sehr schlecht lesbar, mit dem hier kannst du deine SQL-Statements vor dem Posten in eine gute Struktur bringen: http://www.freeformatter.com/sql-formatter.html

    Bei wirklich komplexen Fragen ist es oft hilfreich neben der Beschreibung betroffener Tabellen auch gleich Beispieldaten mitzugeben. Mit diesem Tool kannst du mit uns das Datenbankschema, ein paar Rohdaten und deine bisherigen Abfrageversuche teilen: http://sqlfiddle.com
    Dann würde nur noch eine Beschreibung des erwarteten Ergebnisses fehlen.
    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

    Kommentar


    • #3
      Hallo,

      vielen Dank für die schnelle Antwort!
      Zum Thema Subselect und Join hab ich mich schon eingelesen und alles
      mir Erdenkliche probiert und getestet. Leider ohne den gewünschten Erfolg!
      Genaue Eingabeversuche kann ich jetzt leider nicht mehr posten, das waren
      zuviele die ich versucht hab. Ich hoffe, das ist kein Problem?

      Das hier ist meine Abfrage, so wie sie bis jetzt aussieht:
      Code:
      SELECT
         kegler,
         AVG(volle) as volle,
         AVG(abraumen) as abraumen,
         AVG(fehler) as fehler,
         count(*) as anzahl 
      FROM
         Schnitt 
      WHERE
         hdj = 'Herren' 
      GROUP BY
         kegler 
      ORDER BY
         volle+abraumen DESC
      Die Tabelle sieht so aus:
      http://www.myimg.de/?img=tabelleec442.png

      So sieht das Ergebnis nach der obigen Abfrage dann aus:
      http://www.myimg.de/?img=abfrage00f54.png

      Es sollte jetzt eben nach der Spalte "anzahl" noch die spalte "aushilfe" für jeden Spieler dastehen:
      kegler aushilfe
      Spieler2 0
      Spieler1 0
      Spieler4 0
      Spieler3 1
      Spieler5 1

      Das beste Ergebnis hab ich bis jetzt mit dieser Abfrage hier erzielt:
      Code:
      SELECT
         kegler,
         AVG(volle) as volle,
         AVG(abraumen) as abraumen,
         AVG(fehler) as fehler,
         count(*) as anzahl,
         (SELECT
            COUNT(aushilfe) 
         FROM
            Schnitt 
         WHERE
            aushilfe = 'ja') as aushilfe 
      FROM
         Schnitt 
      WHERE
         hdj = 'Herren' 
      GROUP BY
         kegler 
      ORDER BY
         volle+abraumen DESC
      Dann steht aber hinter jedem Spieler die "2", siehe hier:
      http://www.myimg.de/?img=ergebnis9fc33.png

      Ah, jetzt hats mit dem Prog funktioniert
      http://sqlfiddle.com/#!2/8a8d27/1/0

      Ich hoffe, Ihr könnt mir da noch weiterhelfen...
      Grüße

      Kommentar


      • #4
        Der Ansatz stimmt schonmal, du musst ihm in der Subquery aber auch noch mitteilen, dass er nur die Werte von Aushilfe des entsprechenden Spielers addieren soll.
        Außerdem braucht die Tabelle aus dem Subquery einen Alias, damit die Datenbank weiß wessen Wert sie nehmen muss.
        Subquery:
        Code:
        (SELECT
              COUNT(*) 
           FROM
              Schnitt intern 
           WHERE
              intern.aushilfe = 'ja' AND intern.kegler = Schnitt.kegler)
        [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
        [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

        Kommentar


        • #5
          Wahnsinn, bin total begeistert!

          Nur zum Verständnis noch ein paar Fragen dazu:
          Das "intern" ist praktisch als Variable zu verstehen und es muss nur im subselect drin stehen, dass es vom ersten Select unterschieden werden kann, ist das so pauschal richtig?
          Angenommen, ich würde jetzt noch ein Subselect hinzufügen, dann muss ich das beispielsweise intern2 nennen?

          Der Rest ist mir klar, bis jetzt.
          Danke dir für die schnelle Hilfe, ist echt unglaublich!

          Grüße

          Kommentar


          • #6
            Das intern ist ein sog. Alias und sollte korrekterweise mit "as" definiert werden.

            Select foobar as bar;
            [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

            Kommentar


            • #7
              Der Subquery ist an der Stelle überflüssig. Es ist bei weiten effektiver das so zu machen:
              PHP-Code:
              SUM(IF(aushilfe 'ja'10)) AS aushilfe 

              Kommentar


              • #8
                Ich habe verschiedene Tools ausprobiert, um meinen SQL-Code zu formatieren, aber mein Favorit ist SQL Formatter von Devart. Dieses Tool ist online absolut kostenlos verfügbar und es macht meinen Code besser und beschleunigt das Schreiben.

                Kommentar

                Lädt...
                X