Wyzau: SQL Abfrage über mehrere Spalten (Count)

Hi!

Ich habe eine Tabelle, die folgendermaßen aussieht (und die ich auch leider so nicht wirklich ändern kann):

turnier | spielerdesturniers | spielerdesturniers2 | spielerdesturniers3
1 | a
2 | b | d
3 | a | c
4 | a | b | c

Jetzt möchte ich eine Tabelle, die mir ausgibt, wie oft Spieler a, b, c gewonnen hat:

spieler | anzahl
a | 3
b | 2
c | 2
d | 1

Bisher habe ich folgende Select-Abfrage:

  
SELECT turniere.spielerdesturniers, COUNT(turniere.spielerdesturniers) AS 'sdt' FROM turniere GROUP by turniere.spielerdesturniers ORDER BY sdt DESC  

klar, diese Abfrage bezieht nur die Spalte 'spielerdesturniers' mit ein.

Wie gestaltet sich da meine Abfrage, wenn ich die restlichen Spalten addieren möchte?

  1. Addiert wird wie überall mittels +-Operator

    a+b+c=d

    oder in deinem Fall

    COUNT(a)+COUNT(b)+COUNT(c)=d

    1. Addiert wird wie überall mittels +-Operator

      a+b+c=d

      oder in deinem Fall

      COUNT(a)+COUNT(b)+COUNT(c)=d

      Grundsätzlich ein schöner (weil für mich einfach zu realisierender) Gedanke. Wenn jetzt aber ein Spieler e oder Spieler f dazukommt, bringt mir die Abfrage nichts mehr - ich müsste alle Namen wissen und die Abfrage jedes Mal dementsprechend anpassen.

  2. moin,

    turnier | spielerdesturniers | spielerdesturniers2 | spielerdesturniers3
    1 | a
    2 | b | d
    3 | a | c
    4 | a | b | c

    das sind 4 spalten in der tabelle, dann sollte jeder datensatz auch mit 4 spalten angeben werden. dort wo nichts drinne steht, führe das feld trotzdem auf und setze NULL als "wert" ein.

    Jetzt möchte ich eine Tabelle, die mir ausgibt, wie oft Spieler a, b, c gewonnen hat:

    und spieler des turniers hat dann auch immer gewonnen, sprich es gibt pro turnier 1 bis 3 gewinner ? wenn dem so ist:

    SELECT t.Gewinner, COUNT(*) Anzahl
    FROM (SELECT spielerdesturniers Gewinner
          FROM turniere
          UNION ALL
          SELECT spielerdesturniers2
          FROM turniere
          SELECT spielerdesturniers3
          FROM turniere
         ) t
    WHERE t.Gewinner IS NOT NULL
    GROUP BY t.Gewinner
    ORDER BY t.Gewinner
    ;

    Ilja

    1. das sind 4 spalten in der tabelle, dann sollte jeder datensatz auch mit 4 spalten angeben werden. dort wo nichts drinne steht, führe das feld trotzdem auf und setze NULL als "wert" ein.

      Das hab ich jetzt gemacht - alle Felder, wo nichts drin war, habe ich auf NULL gesetzt.

      Jetzt möchte ich eine Tabelle, die mir ausgibt, wie oft Spieler a, b, c gewonnen hat:

      und spieler des turniers hat dann auch immer gewonnen, sprich es gibt pro turnier 1 bis 3 gewinner ? wenn dem so ist:

      Ja, ich will einfach eine Tabelle, wo drin steht, wie oft jeder schon Spieler des Turniers war.

      SELECT t.Gewinner, COUNT(*) Anzahl
      FROM (SELECT spielerdesturniers Gewinner
            FROM turniere
            UNION ALL
            SELECT spielerdesturniers2
            FROM turniere
            SELECT spielerdesturniers3
            FROM turniere
           ) t
      WHERE t.Gewinner IS NOT NULL
      GROUP BY t.Gewinner
      ORDER BY t.Gewinner
      ;

      Ilja

      Leider funktioniert das bei mir nicht. Meine MySql Version ist laut Phpmyadmin 5.0.32
      Kann ich irgendwie nachschauen, wo der Fehler liegen kann?

      $sql6= "SELECT t.Gewinner, COUNT(*) Anzahl
      FROM (SELECT turniere.spielerdesturniers Gewinner
            FROM turniere
            UNION ALL
            SELECT turniere.spielerdesturniers2
            FROM turniere
            SELECT turniere.spielerdesturniers3
            FROM turniere
          ) t
      WHERE t.Gewinner IS NOT NULL
      GROUP BY t.Gewinner
      ORDER BY t.Gewinner";

      $query6 = mysql_query($sql6) or die("Anfrage6 nicht erfolgreich");

      1. moin,

        Leider funktioniert das bei mir nicht. Meine MySql Version ist laut Phpmyadmin 5.0.32
        Kann ich irgendwie nachschauen, wo der Fehler liegen kann?

        es fehlte ein UNION ALL

        SELECT t.Gewinner, COUNT(*) Anzahl
        FROM (SELECT turniere.spielerdesturniers Gewinner
              FROM turniere
              UNION ALL
              SELECT turniere.spielerdesturniers2
              FROM turniere
              UNION ALL -- dieses UNION ALL fehlte
              SELECT turniere.spielerdesturniers3
              FROM turniere
            ) t
        WHERE t.Gewinner IS NOT NULL
        GROUP BY t.Gewinner
        ORDER BY t.Gewinner
        ;

        1. Hurra! So funktionierts! Vielen vielen Dank!

        2. Hallo,

          ich stehe gerade vor exakt dem gleichen Problem.
          Leider habe ich nur MySQL 4.0.27 zur Verfügung, Subselects sind also nicht möglich.
          Kennt jemand einen anderen Weg?

          1. Hi!

            Leider habe ich nur MySQL 4.0.27 zur Verfügung, Subselects sind also nicht möglich.
            Kennt jemand einen anderen Weg?

            Ohne jetzt genau das Problem angeschaut zu haben: generelle Möglichkeiten sind temporäre Tabellen und Joins. Siehe auch Rewriting Subqueries as Joins.

            Lo!

          2. moin,

            ich stehe gerade vor exakt dem gleichen Problem.
            Leider habe ich nur MySQL 4.0.27 zur Verfügung, Subselects sind also nicht möglich.

            genau das gleiche problem wird es sicherlich nicht sein, deswegen müsstest du es genauer ausführen. aber zu dem was Dedlfix gesagt hat könnten eventuell views zum einsatz kommen. kenne mich allerdings mti den versionen von mysql vor 4.1 nicht aus.

            Ilja

            1. Hi!

              Leider habe ich nur MySQL 4.0.27 zur Verfügung, Subselects sind also nicht möglich.
              aber zu dem was Dedlfix gesagt hat könnten eventuell views zum einsatz kommen. kenne mich allerdings mti den versionen von mysql vor 4.1 nicht aus.

              Nee, Views gibt es erst ab 5.0.

              Lo!

              1. moin,

                Nee, Views gibt es erst ab 5.0.

                ok, das schockiert mich jetzt ein wenig, views erst ab 5.0 ist....erschreckend

                Ilja

                1. Hi!

                  Nee, Views gibt es erst ab 5.0.
                  ok, das schockiert mich jetzt ein wenig, views erst ab 5.0 ist....erschreckend

                  Naja, wenn ich mir die Anzahl der Fragen hier ansehe, die sich um Views drehen, bekomme ich den Eindruck, dass die sowieso niemand verwendet. Ebensowenig sehe ich Lösungsvorschläge, die Views propagieren.

                  Wo spielen Views denn überhaupt eine Rolle, außer einem abfragenden Programm eine Tabelle vorzugaukeln, die in der Form gar nicht existiert? Sowas braucht man im Prinzip doch nur für fertige Software, wie ORMs, wenn diese nur 0815-Abfragen stellen kann, oder?

                  Lo!

                  1. moin,

                    Naja, wenn ich mir die Anzahl der Fragen hier ansehe, die sich um Views drehen, bekomme ich den Eindruck, dass die sowieso niemand verwendet.

                    das liegt wohl eher an der natur des forums, dass hier viele fragen bezüglich datenbanken doch eher "einfach" sind. daraus den schluss zu ziehen, views werden nicht gebraucht, den kann ich nicht nachvollziehen. das hat man ja ganz offensichtlich bei mysql auch anders bewertet, sonst wären sie nicht eingeführt worden.

                    Wo spielen Views denn überhaupt eine Rolle, außer einem abfragenden Programm eine Tabelle vorzugaukeln, die in der Form gar nicht existiert?

                    grundsätzlich überall dort, wo ich die "realen" objekte und inhalte hinter einer view verbergen will oder aber mir das leben erleichtern will, um komplexe sql statements nicht immer neu schreiben zu müssen, bzw. ich dadurch redundante abfragen vermeide und somit auch fehler vorbeugen kann.

                    Sowas braucht man im Prinzip doch nur für fertige Software, wie ORMs, wenn diese nur 0815-Abfragen stellen kann, oder?

                    sehe ich anders, mit views kann ich eine weitere logische ebene schaffen, sprich ich habe damit einen weiteren schritt zur datenbankunabhängigkeit. anwendung A braucht eine andere sicht der dinge als anwendung B. des weiteren sind views eine gute möglichkeit für das sicherungskonzept. ich will nicht, dass jeder immer gleich die ganze tabelle sehen kann, sondern dass ich bestimmte spalten ausblende, anders darstelle oder nur bestimmte datensätze selektiert werden.

                    Ilja