Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Anfänger SQL-Abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von matze9999, 31 Mai 2013.

  1. matze9999

    matze9999 Neuer Benutzer

    Hallo,
    ich bin gerade dabei SQL zu lernen und möchte nun eine Abfrage erstellen, bei der mir die Mannschaft (und zwar soll nur die Mannschaft ohne die Anzahl der Spieler) ausgegeben wird mit den meisten ausländischen Spielern.

    Hier mein Datenbankschema:

    CREATE TABLE team(
    team id INTEGER PRIMARY KEY,
    name TEXT,
    sponsor TEXT
    ) ;
    CREATE TABLE s p i e l e r (
    s p i e l e r i d INTEGER PRIMARY KEY,
    vorname TEXT,
    nachname TEXT,
    g eha l t INTEGER,
    n a t i o n a l i t a e t TEXT,
    geburtsdatum DATE,
    team id INTEGER,
    FOREIGN KEY ( team id ) REFERENCES team( team id )
    ) ;

    Mit den folgenden Datensätzen:

    INSERT INTO "team" VALUES (NULL, "Werder Bremen", "Wiesenhof");
    INSERT INTO "team" VALUES (NULL, "Borussia Dortmund", "Evonik");
    INSERT INTO "team" VALUES (NULL, "Bayern Muenchen", "T-Mobile");
    INSERT INTO "team" VALUES (NULL, "Bayer Leverkusen", "SunPower");
    INSERT INTO "team" VALUES (NULL, "Hamburger SV", "Fly Emirates");

    INSERT INTO "spieler" VALUES(NULL, "Robert", "Lewandowski", 125000, "polnisch", "1988-08-21", 2);
    INSERT INTO "spieler" VALUES(NULL, "Marco", "Reus", 333000, "deutsch", "1989-05-31", 2);
    INSERT INTO "spieler" VALUES(NULL, "Aaron", "Hunt", 368000, "deutsch", "1986-09-04", 1);
    INSERT INTO "spieler" VALUES(NULL, "Rene", "Adler", 223000, "deutsch", "1985-01-15", 5);
    INSERT INTO "spieler" VALUES(NULL, "Dennis", "Aogo", 210000, "deutsch", "1987-01-14", 5);
    INSERT INTO "spieler" VALUES(NULL, "Franck", "Ribery", 1080123, "franzoesisch", "1983-04-07", 3);
    INSERT INTO "spieler" VALUES(NULL, "Javi", "Martinez", 500000, "spanisch", "1988-09-02", 3);
    INSERT INTO "spieler" VALUES(NULL, "Son", "Heung-min", 500000, "suedkoreanisch", "1992-07-08", 5);


    Mein erster Vorschlag wäre:
    select name1 from(
    select name1, max(anzahl) from (
    select name as name1, count(spieler_id) as anzahl from team t1
    join spieler s1 on t1.team_id = s1.team_id
    where nationalitaet !='deutsch'
    group by t1.name));

    Allerdings wird mir hier komischerweise, was ich überhaupt nicht verstehe, Hamburger SV ausgegeben obwohl der Subselect, den ich fett markiert habe, Bayern München und 2 für die Count-Fkt. ausgibt.
    Wäre super, wenn mir jemand eine funktionierende Anweisung sagen könnte und mir verraten könnte warum meine Abfrage so arbeitet, wie sie arbeitet.

    Vielen Dank
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Ich verwende ja kein MySQL, aber warum setzt Du teamid und spielerid auf NULL?

    Code:
    test=*# select * from team;
     teamid |       name        |   sponsor
    --------+-------------------+--------------
          1 | Werder Bremen     | Wiesenhof
          2 | Borussia Dortmund | Evonik
          3 | Bayern Muenchen   | T-Mobile
          4 | Bayer Leverkusen  | SunPower
          5 | Hamburger SV      | Fly Emirates
    (5 rows)
    
    Time: 0,187 ms
    test=*# select * from spieler;
     spielerid | vorname |  nachname   | gehalt  | nationalitaet  | geburtsdatum | teamid
    -----------+---------+-------------+---------+----------------+--------------+--------
             1 | Robert  | Lewandowski |  125000 | polnisch       | 1988-08-21   |      2
             2 | Marco   | Reus        |  333000 | deutsch        | 1989-05-31   |      2
             3 | Aaron   | Hunt        |  368000 | deutsch        | 1986-09-04   |      1
             4 | Rene    | Adler       |  223000 | deutsch        | 1985-01-15   |      5
             5 | Dennis  | Aogo        |  210000 | deutsch        | 1987-01-14   |      5
             6 | Franck  | Ribery      | 1080123 | franzoesisch   | 1983-04-07   |      3
             7 | Javi    | Martinez    |  500000 | spanisch       | 1988-09-02   |      3
             8 | Son     | Heung-min   |  500000 | suedkoreanisch | 1992-07-08   |      5
    (8 rows)
    
    Time: 0,220 ms
    test=*# select * from team right join (select teamid, count(nationalitaet) from spieler where nationalitaet != 'deutsch' group by teamid order by 2 desc limit1) x on team.teamid=x.teamid;
     teamid |      name       | sponsor  | teamid | count
    --------+-----------------+----------+--------+-------
          3 | Bayern Muenchen | T-Mobile |      3 |     2
    (1 row)
    
    Mit PostgreSQL gemacht ;-)

    Andreas
     
  3. Tommi

    Tommi Datenbank-Guru

    Hallo matze9999,

    ich habe einen ähnlichen Ansatz wie Andreas, nur dass ich auf ein Sub-Select verzichte.
    Die Syntax ist zwar vom MS SQL Server, aber ich glaube, dass dich das ganz leicht auch auf MySQL umsetzen läßt:

    Code:
    SELECT TOP 1 T.[team id], T.name as Team,
    COUNT(DISTINCT S.[spielerid]) as Anzahl
    FROM #team T
    LEFT OUTER JOIN #spieler S
       ON S.[team id]=T.[team id]
       AND S.[nationalitaet]='deutsch'
    GROUP BY T.[team id], T.name
    ORDER BY Anzahl DESC
    (mich irritiert übrigens auch der Wert NULL für die ID beim INSERT. Ein PRIMARY KEY darf in der Regel nicht NULL sein! Evtl. ist das by MySQL anders? :eek: )

    Viele Grüße,
    Tommi
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden