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

Abfrage über mehrere Tabellen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Cilenco, 29 Januar 2013.

  1. Cilenco

    Cilenco Benutzer

    Hallo @ all

    Ich habe folgendes Datenbankmodell:

    [​IMG]

    Nun Möchte ich gerne folgendes Abfragen:
    Alle Schüler mit eventl. Noten von einem Bestimmten Fach

    Habe es schon so probiert:
    Code:
    SELECT S._id, S.Vname, S.Nname, S.Geb, N.Note FROM
    ((Schueler S LEFT JOIN Noten N ON S._id = N._idSchueler)
    LEFT JOIN Pruefung P ON N._idPruefung = P._id)
    WHERE P.Fach = (SELECT F._id FROM Fach F WHERE F.Name = 'Deutsch')
    
    Leider klappt das so gar nicht. Wenn ich ein Fach angebe, in welchem noch keine Arbeiten geschrieben wurden werden mir keine Schüler angezeigt. Was habe ich falsch gemacht?

    Bin für jede Hilfe dankbar. Viele Grüße
    Cilenco
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Normal, nicht?

    Wenn noch kein Schüler da eine Arbeit geschrieben hat im Fach z.B. 'datenbanken', dann kann auch keiner angezeigt werden.

    Code:
    test=*# select * from schueler ;
     id |   name
    ----+-----------
      1 | schueler1
      2 | schueler2
      3 | schueler3
    (3 rows)
    
    test=*# select * from noten ;
     note | id_schueler | id_pruefung
    ------+-------------+-------------
        3 |           1 |           1
        4 |           2 |           1
        5 |           1 |           2
    (3 rows)
    
    test=*# select * from pruefung ;
     id | fach
    ----+------
      1 |    1
      2 |    2
      3 |    3
    (3 rows)
    
    test=*# select * from fach ;
     id |    name
    ----+-------------
      1 | deutsch
      2 | mathe
      3 | datenbanken
    (3 rows)
    
    Wenn Du nun alles richtig zusammenjoinst, ohne WHERE, bekommst:

    Code:
    test=*# select s.name, s.id, f.name from schueler s left join noten n on s.id=n.id_schueler left join pruefung p on n.id_pruefung=p.id left join fach f on n.id_pruefung=f.id;
       name    | id |  name
    -----------+----+---------
     schueler1 |  1 | deutsch
     schueler2 |  2 | deutsch
     schueler1 |  1 | mathe
     schueler3 |  3 |
    (4 rows)
    
    Deine Abfrage umgestellt auf 'saubere' JOIN-Syntax mit einem nicht geprüften Fach:

    Code:
    test=*# select s.name, s.id, f.name from schueler s left join noten n on s.id=n.id_schueler left join pruefung p on n.id_pruefung=p.id left join fach f on n.id_pruefung=f.id where f.name = 'datenbanken';
     name | id | name
    ------+----+------
    (0 rows)
    
    Was genau suchst Du nun?


    Andreas
     
  3. Cilenco

    Cilenco Benutzer

    Danke schonmal dafür ja das leuchtet ein.

    Also ich habe eine Klasse und ein Fach gegeben.
    Nun möchte ich ALLE Schüler der Klasse ausgeben und wenn vorhanden die Noten aus dem Fach (bezogen auf den Schüler natürlich)

    Nacher soll da also ca stehen
    Code:
    S.name    | id | Note 1  | Note 2
    -----------+----+---------+--------
    Christian  | 1  |    1    | 2
    Johannes   | 2  |    2    | 3
    David      | 3  |         |
    
    Das da Note 1 und Note 2 nicht als einzelne Spalte steht ist mir schon klar soll es nur verdeutlichen ;)
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Das ist jetzt wieder was anderes, gell?

    Du willst wissen, wie viele Noten 1, 2 ... jeder hat? Dafür gibt es Aggregatfunktionen, Du suchst was in der Art 'select name, id, note, count(1) from ... group by name,id,note'.


    So, und nun übst Du mal a bissl, ja? ;-)

    Andreas
     
  5. Cilenco

    Cilenco Benutzer

    Nein Nein Nein :D

    Ich möchte einfach ALLE Schüler aus einer Klasse und ihre Noten aus einem Fach wenn sie schon Prüfungen darin geschrieben haben. Wenn nicht sollen trotzdem alle Schüler ausgegeben werden
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Dann such den Unterschied, hier:

    Code:
    test=*# select s.name, s.id, f.name from schueler s left join noten n on s.id=n.id_schueler left join pruefung p on n.id_pruefung=p.id left join fach f on n.id_pruefung=f.id;
       name    | id |  name
    -----------+----+---------
     schueler1 |  1 | deutsch
     schueler2 |  2 | deutsch
     schueler1 |  1 | mathe
     schueler3 |  3 |
    (4 rows)
    
    test=*# select s.name, s.id, f.name from schueler s left join noten n on s.id=n.id_schueler left join pruefung p on n.id_pruefung=p.id left join fach f on (n.id_pruefung=f.id and f.name='deutsch');
       name    | id |  name
    -----------+----+---------
     schueler1 |  1 | deutsch
     schueler2 |  2 | deutsch
     schueler1 |  1 |
     schueler3 |  3 |
    (4 rows)
    
    Andreas
     
  7. Cilenco

    Cilenco Benutzer

    Also ich habe jetzt mal eine Access Datenbank vorbereitet damit du besser verstehst was ich brauche. Die Abfrage 1 soll eigentlich so sein wie sie jetzt gerade ist nur, dass bei Datensatz 5 die letzten 2 Zellen auch leer sein sollen. Wie muss ich die Abfrage bearbeiten damit das klappt?
     

    Anhänge:

  8. akretschmer

    akretschmer Datenbank-Guru

    Also ich zumindest kann Dir nicht weiter helfen: Access läuft nicht auf Linux ;-)


    Andreas
     
  9. Cilenco

    Cilenco Benutzer

    Ich hab mal ein Bild für dich zusammengestellt ;) Das oben ist die Ausgabe und die SQL Anweisung die er mir ausspukt - ist nicht ganz so schön aber das ist halt Microsoft ;)
    Bei ID 5 soll halt Englisch und die Note 5 wegfallen...
    Unbenannt.jpg
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Ist mir zu mühsam, aus einem Bild Dinge wie Tabellenstruktur, Inhalte der Tabellen etc. zu lesen. Sorry. Verwendest Du nun MySQL oder Access oder was?
     
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