Datenbankabfrage -Denkfehler
Frage: Datenbankabfrage -Denkfehler(16 Antworten)
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 |
Antwort von -max- (ehem. Mitglied) | 28.05.2010 - 18:52 |
wenn http://www.php.de/datenbanken/10176-pruefen-ob-eintrag-vorhanden-ist.html |
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.. |
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 |
Antwort von S_A_S | 28.05.2010 - 21:42 |
Nee, die Fragen sind statisch gegeben, die stellen keine Personen. Zitat: 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. |
Antwort von den_letz | 28.05.2010 - 21:47 |
das müsste dann mit einer sub-query sein. |
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. |
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) |
Antwort von S_A_S | 28.05.2010 - 23:46 |
Also wenn ich erst mal das kartesische Produkt aus Fragen und Antworten bilde? |
Antwort von E___ | 28.05.2010 - 23:48 |
Ja , das meinte ich. |
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. |
Antwort von E___ | 29.05.2010 - 00:18 |
Ja ich weiss, ist mir jetzt auch nur Spontan eingefallen. Zitat: Ja da fällt mir spontan nichts ein. |
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. |
Antwort von E___ | 29.05.2010 - 10:15 |
Ach sry falsch gelesen. Dachte ein "USer die Frage noch nicht beantwortet". Zitat: 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? |
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. |
1 ähnliche Fragen im Forum:
> Du befindest dich hier: Support-Forum - Informatik- PHP und SQL in HTML-Code für Datenbankabfrage (2 Antworten)
- mehr ...
ÄHNLICHE FRAGEN:
- PHP und SQL in HTML-Code für DatenbankabfrageIch muss in einem HTML-Code mit PHP und SQL eine Verbindung zu meiner Datenbank auf MySQL aufbauen und eine Datenabfrage sowie ..
- mehr ...