sql inkonsistenz und subselect

haiflosse

Benutzer
Beiträge
7
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.520
Ich habe zwei Tabellen, die ich miteinander verbinde um herauszufinden, wieviel Fragen ein bestimmter Teilnehmer noch nicht durchgeführt hat.

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)
 
Werbung:

haiflosse

Benutzer
Beiträge
7
Code:
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)

Danke für die Antwort. Dieses select funktioniert. Danke
 
Oben