Menu schließen

Datenbankabfrage -Denkfehler

Frage: Datenbankabfrage -Denkfehler
(16 Antworten)


Autor
Beiträge 4080
17
Hi,
ich habe einen kleinen Denkfehler für eine Datenbank Abfrage.

Ich habe im wesentlichen drei Tabellen. Eine Personentabelle, eine Fragentabelle und eine Antworttabelle.
In der Antwortabelle Speicher ich FragenID und PersonenID.
Wie kann ich mir mit SQL eine Liste der Personen ausgeben lassen, die eine Frage noch nicht beantwortet haben?

Also Wenn in Pers. Beispielsweise Person A, B drin steht. Ich die Fragen 1,2 habe.
Dann natürlich in Antworten A&1, A&2 und B&1 steht, dass er mir sinngemäß ausgibt Person B hat Frage 2 noch nicht beantwortet?
Frage von S_A_S | am 28.05.2010 - 17:29


Autor
Beiträge 1563
10
Antwort von -max- | 28.05.2010 - 18:52
wenn
ich dein Problem richtig verstanden hab müsstest du das darauf anpassen können:

http://www.php.de/datenbanken/10176-pruefen-ob-eintrag-vorhanden-ist.html


Autor
Beiträge 4080
17
Antwort von S_A_S | 28.05.2010 - 19:02
Leider nein.
Ich habe ja drei Tabellen und will quasi gucken welche Person wozu noch antworten muss - das ganze muss aber ganz mit SQL realisiert werden.
Und es geht auch leider nicht um eine bestimmte Frage, sondern generell um alle Fragen, weswegen ich auch gleichzeitg in dem Output: PersonenNr, PersonenName und Fragentext brauche.

Ich hab schon alles mögliche Versucht mit SELECT ... WHERE NOT EXISTS(<<subquery>>) aber irgendwie hat das nicht so ganz geklappt.
Was ich wiederum hinbekommen habe war eine entsprechende Abfrage wer schon wozu gentwortet hatte. Leider nicht die umkehrung, was mich dann ziemlich auf der Stelle treten lies.

 
Antwort von GAST | 28.05.2010 - 19:07
spontan würde ich mal sagen das du noch tabellen brauchst..
also das die beziehungen nicht ganz stimmen..

aber ihc komme auch gerade erst von der arbeit, bin müde un hab hunger. da fällts denken schwer :D

 
Antwort von GAST | 28.05.2010 - 19:13
also, wenn ich das richtig sehe
eine person kann mehrere fragen haben, eine frage kann mehrere personen haben...
brauchste ne vierte tabelle...
und dann müssts ganz einfach gehen ohne unterabfrage..


Autor
Beiträge 371
3
Antwort von den_letz | 28.05.2010 - 19:16
SELECT PersonenID,FragenID
FROM Personnentabellen,Fragentabelle,Antworttabelle
WHERE Personnentabelle.PersonenID = Fragentabelle.FragenID
AND Fragentabelle.secondary key= .Antworttabelle.Primary key?
AND Antworttabellen Primary key IS NULL

ODER AntwortetabellenField =NO

ich wusste leider dain primary key deiner antwortabellen nicht


Autor
Beiträge 4080
17
Antwort von S_A_S | 28.05.2010 - 21:42
Nee, die Fragen sind statisch gegeben, die stellen keine Personen.

Zitat:

SELECT PersonenID,FragenID
FROM Personnentabellen,Fragentabelle,Antworttabelle
WHERE Personnentabelle.PersonenID = Fragentabelle.FragenID
AND Fragentabelle.secondary key= .Antworttabelle.Primary key?
AND Antworttabellen Primary key IS NULL
ODER AntwortetabellenField =NO

Die Fragen haben keine PersonenID.

Außerdem, wenn sie eine Hätten, dann würde mir das nicht die liste der Fragen liefern, die noch nicht von Personen beantwortet sind.

Was ich aber habe ist ein fixer Fragenkatalog, der von jeder Person zu beantworten ist. In sofern will ich nur wissen, welche Person welche Frage noch nicht beantwortet hat.
Also Quasi welcher User.ID noch nicht für eine Fragen.ID in der Antwortentabelle steht.


Autor
Beiträge 371
3
Antwort von den_letz | 28.05.2010 - 21:47
das müsste dann mit einer sub-query sein.


Autor
Beiträge 4080
17
Antwort von S_A_S | 28.05.2010 - 21:54
ja natürlich.
die frage ist wie ;)

Im Prinzip hatte ich schon sowas wie
SELECT User.ID, User.Name, Frage.Text
FROM User, Frage
WHERE Frage.aktiv = true AND NOT EXISTS (...
und genau bei ... hört das ganze auf zu funktionieren - in dem Teil wollte ich mir nämlich einfach die Leute ausgeben lassen die schon zu einer Frage genatwortet haben.
Also hab ich in dem Exitsteil erst die Antworten Tabelle zu referenzieren, was ja auch von der Überleungher richtig ist.

Weil am Ende brauch ich ja ne Explizite Liste mit Fragen und Namen.


Autor
Beiträge 722
1
Antwort von E___ | 28.05.2010 - 23:44
Auf Anhieb fällt mir jetzt keine Lösung mit einem Join/Subquery ein.

Bei "Not in" oder "Not Exist" hapert es an der Bedingung.

Spontan fällt mir nur folgendes ein.
Das man eine" virtuelle Tabelle", die alle Kombinationen erhält mit der AntwortTablle vergleichst. Also die !Schnittmenge ausgeben lassen.

Geht auch bestimmt anderster aber dazu müsste ich mich morgen mal reindenken( ist jetzt schon zu spät)


Autor
Beiträge 4080
17
Antwort von S_A_S | 28.05.2010 - 23:46
Also wenn ich erst mal das kartesische Produkt aus Fragen und Antworten bilde?


Autor
Beiträge 722
1
Antwort von E___ | 28.05.2010 - 23:48
Ja , das meinte ich.


Autor
Beiträge 4080
17
Antwort von S_A_S | 28.05.2010 - 23:52
hm ja, das ist eigentlich etwas, dass ich immer vermeiden will auf grund der lauftzeit.

die bedingung für not exits wäre ja, dass ich da in der subabfrage die elemente drin habe,die die bed. efüllen, dass ein user die frage schon beantwortet hat.
Ich krieg auch leicht die Liste Alle Antworten kombiniert mit den Fragetexten und den Usernamen. Aber leider kann ich das nicht so einfach ins das notexits schieben, da er mir dann keine Zeile zurückigbt, wenn jede Person schon mal mindestens eine Antwort zu irgendwas gegeben hat.


Autor
Beiträge 722
1
Antwort von E___ | 29.05.2010 - 00:18
Ja ich weiss, ist mir jetzt auch nur Spontan eingefallen.

Zitat:
die bedingung für not exits wäre ja, dass ich da in der subabfrage die elemente drin habe,die die bed. efüllen, dass ein user die frage schon beantwortet hat.

Ja da fällt mir spontan nichts ein.


Autor
Beiträge 4080
17
Antwort von S_A_S | 29.05.2010 - 00:35
Naja erfüllbarkeit ist ja in sofern recht leicht.
Du kriegst raus leicht raus, dass ein user ne frage schon beantwortet hat wenn man
SELECT User.ID
FROM User, Fragen, Antworten
WHERE User.ID = Antworten.ID AND Antworten.Frage= Frage.ID

macht.

Dusseligerweise kann ich die Abfrage nicht einfach so in eine not exits packen.
Das wäre dann einfach ein natural join über drei Tabellen wäre.


Autor
Beiträge 722
1
Antwort von E___ | 29.05.2010 - 10:15
Ach sry falsch gelesen. Dachte ein "USer die Frage noch nicht beantwortet".
Zitat:

SELECT User.ID
FROM User, Fragen, Antworten
WHERE User.ID = Antworten.ID AND Antworten.Frage= Frage.ID


Vorschlag:

SELECT User.ID,Frage.ID
FROM User, Fragen
WHERE User.ID = Antworten.ID AND Frage.ID Not Exist( Select Antworten.Frage from Antworten)

Blöde ist, ich kann nichts ausprobieren.

Frage nebenbei: Sollen User die garkeine Fragen beantwortet haben auch aufgelistet werden oder nur die bei denen was fehlt?


Autor
Beiträge 4080
17
Antwort von S_A_S | 29.05.2010 - 10:58
Also an sich sind mir diejenige, wo etwas fehlt wichtiger - weil da brauch ich dann ja dazu auch noch die noch nicht beantworteten Fragen.
Die Leute, die noch gar nichts beantwortet haben kann man auch bedeutend leichter abfragen.


Dein Beispiel lässt sich so nicht umsetzen, man kann leider (Not) Exitsts nicht direkt auf eine Variable mit blabla = (Not) Exists(...)
Anwenden.
Außerdem Hat die Antwort.ID nichts mit der User.ID zu tun das wäre ion dem Fall einfach Antworten.User.


Im Prinzip hast du die Tabelle User:
Mit User.ID, User.Name und ein paar weiteren Infos wie Kontaktdaten und Statistischen Informationen wie z.b. das Alter, die aber keine Rolle spielen.
Dann hast du die Tabelle Fragen
Mit Fragen.ID, Fragen.Text und noch ein paar weiteren Feldern, die auch für die Abfrage keine Rolle spielen. Wobei Fragen.ID einfach die Nr. der Frage ist.
Dann gibt es die Anworten Tabelle und dort hast du eben an wichtigen Feldern:
Antworten.ID (nr. der Antwort),Antworten.Frage (Fremdschlüssel auf FrageID) und Antworten.User (Fremdschlüssel auf User.ID) und natürlich Antworten.Text sowie ein paar weitere Felder, die widerum in diesem Kontext egal sind.

Verstoß melden Thread ist gesperrt
Hast Du eine eigene Frage an unsere Informatik-Experten?

1 ähnliche Fragen im Forum: 0 passende Dokumente zum Thema:
> Du befindest dich hier: Support-Forum - Informatik
ÄHNLICHE FRAGEN: