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

sql inkonsistenz und subselect

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von haiflosse, 9 Oktober 2013.

  1. haiflosse

    haiflosse Benutzer

    Ich habe zwei Tabellen, die ich miteinander verbinde um herauszufinden, wieviel Fragen ein bestimmter Teilnehmer noch nicht durchgeführt hat.

    Dazu gibt es eine questions Tabelle mit den Feldern id_q und eine Tabele u_questions mit den Feldern id_u und id_q

    Mein SQL um alle Fragen anzuzeigen, die sich Inder Tabelle questions befinden und noch nicht in der Tabelle u_questions sieht wie folgt aus:


    SELECT questions.*
    FROM questions LEFT JOIN u_questions ON questions.ID = u_questions.id_q
    WHERE u_questions.id_q Is Null;

    Dieses SQL funktioniert auch wunderbar. Nur ich möchte nur alle Datensätze in der Tabelle u_questions berücksichtigen, die eine bestimmte id_u (z.B. id_u=19) betrifft.
    Eine Erweiterung des where wie z.B. and id_u=19 funktioniert nicht.

    Daher wollte ich wissen wie ich dies abfragen kann. Ich denke, dass da ein Subselect notwendig ist, aber wie kann ich dies richtig einbauen.

    Danke
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Dir fehlt eine dritte Tabelle, die die Users enthält.

    Code:
    test=*# select * from users;
     id_u
    ------
      1
      2
      3
    (3 rows)
    
    test=*# select * from questions ;
     id_q
    ------
      1
      2
      3
    (3 rows)
    
    test=*# select * from u_questions;
     id_u | id_q
    ------+------
      1 |  1
      1 |  2
      2 |  1
      2 |  3
    (4 rows)
    
    test=*# select * from (select u.id_u, q.id_q from users u cross join questions q) a left join u_questions uq on ((a.id_u, a.id_q) = (uq.id_u, uq.id_q));
     id_u | id_q | id_u | id_q
    ------+------+------+------
      1 |  1 |  1 |  1
      1 |  2 |  1 |  2
      1 |  3 |  |
      2 |  1 |  2 |  1
      2 |  2 |  |
      2 |  3 |  2 |  3
      3 |  1 |  |
      3 |  2 |  |
      3 |  3 |  |
    (9 rows)
    
    test=*# select * from (select u.id_u, q.id_q from users u cross join questions q) a left join u_questions uq on ((a.id_u, a.id_q) = (uq.id_u, uq.id_q)) where uq.id_u is null;
     id_u | id_q | id_u | id_q
    ------+------+------+------
      1 |  3 |  |
      2 |  2 |  |
      3 |  1 |  |
      3 |  2 |  |
      3 |  3 |  |
    (5 rows)
    
     
  3. haiflosse

    haiflosse Benutzer

    Danke für die Antwort. Dieses select funktioniert. Danke
     
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