aus SQL genau die richtigen werte Filtern,..

JesusFreak777

Erfahrenes Mitglied
Hallo

Das ganze wird mal ein QUIZ,...

ich hab 2 tabellen,...


quizdb:
quizid
frage
antwort
falsche antwort1
...

und
statsdb:
statsid
qid
uid
punkte
...

wenn der user mit der id 1 jetzt ne frage beantwortet trägt er in die tabelle statsdb ne automatische id ein die user id (user 1 ist imma user 1) und die Quizid von der frage die der user beantwortet habe,...

wenn ich jetzt das ganze ausgebe schreibt er mir:

Script:
HTML:
SELECT * 
FROM quizdb

LEFT OUTER JOIN statsdb
ON
statsdb.QID = quizdb.QuizID

LEFT OUTER JOIN userdb
ON
userdb.UserID = statsdb.UID

ORDER BY quizdb.QuizID

quiz id |user id|
---1-----|---1------|
---2-----|---1------|
---2-----|---2------|
---3-----|-----------|
---4-----|-----------|
---5-----|---1------|
---5-----|---2------|
---5-----|---3------|
---6-----|---4------|
---6-----|---2------|
---7-----|---1------|
---8-----|-----------|

usw,....

wie kann ich jetzt direkt im sql prüfen ob user x ($UserID) die frage schon beantwortet hat und dann einfach die nächste quizidid ausgeben,...

wenn ich mach
WHERE statsdb.UID != $UserID

dann gibt er mir zwar die qid nicht mehr aus die der user schon beantwortet hat,... aber hat ein anderer user die frage schonmal beantwortet gibts wie quizid zweimal einmal mit meiner ID (die kann ich ausschließen) und einmal mit seiner ID,...

und irgendwie komm ich nicht weiter,...

in der theorie müsste jetzt der user 1 zugriff auf die fragen 3, 4, 6 und 8 haben,... nach meiner Programmierung hat er aber zugriff auf 2, 3, 4, 5, 6 und 8 weil 2 und 5 von einem anderen user beantwortet worden sind und in meiner virtuellen tabelle jetzt zweimal erschienen sind :(

*HILFE*

kann mir da jemand helfen?
 
Zuletzt bearbeitet:
In der Art vielleicht?

Code:
SELECT * from quizdb q LEFT JOIN (SELECT quizid  as beantwortet from statsdb s where UID=$uid) b on b.beantwortet=q.quizid where b.beantwortet IS NULL
 
Zuletzt bearbeitet:
wow danke es geht,...

:)

*HAPPY*



edit:
ein kleines Problemchen hab ich doch noch,...
wenn der user jetzt alle fragen beantwortet hat, gibt es dann die möglichkeit nen fehler vom SQL aus schon auszugeben,...
also wenn nach der where bedingung kein wert mehr vorhanden ist dann $error = "error";?

geht das?
 
Zuletzt bearbeitet:
hallo

ich brauch noch 2 zusatzfunktionen,...
die erste ist die ausgabe der frage ist ja momentag begrenzt auf noch nicht beantwortet, das heißt wenn user 1 die frage schonmal beantwortet hat kann er sie nicht mehr beantworten,... kann ich das so machen das er die frage nur heute nicht mehr beantworten darf,.. aber ab morgen schon wieder,... in der statsdb wird das datum eingetragen

das zweite war kann ich die ausgabe auf ne punktzahl beschränken,... in jeder frage gibt es auch den wert punkte,... kann ich in der ausgabe auch durch ner variablen $punkte = "2"; angeben das er jetzt nur die fragen mit den punkten 2 anzeigt?

das müsste ja beides auf das selbe rauslaufen, zumindest so ca. aber wie ich das dann einfüge und vorallem beides,... mit AND?

Danke für eure Hilfe

Gruß Simon
 
ein kleines Problemchen hab ich doch noch,...
wenn der user jetzt alle fragen beantwortet hat, gibt es dann die möglichkeit nen fehler vom SQL aus schon auszugeben,...
also wenn nach der where bedingung kein wert mehr vorhanden ist dann $error = "error";?

Wenn kein Wert vorhanden ist, wird eine leere Tabelle ausgegeben. Um eine Fehlermeldung auszugeben, muss in der Anwendung überprüft werden, ob die Tabelle leer ist. In PHP z.B. mit
PHP:
if (mysql_num_rows($result)==0) {
  //Fehlermeldung
};
 
ich brauch noch 2 zusatzfunktionen,...
die erste ist die ausgabe der frage ist ja momentag begrenzt auf noch nicht beantwortet, das heißt wenn user 1 die frage schonmal beantwortet hat kann er sie nicht mehr beantworten,... kann ich das so machen das er die frage nur heute nicht mehr beantworten darf,.. aber ab morgen schon wieder,... in der statsdb wird das datum eingetragen
Im Subselect:
Code:
SELECT quizid  AS beantwortet FROM statsdb s WHERE UID=$uid AND datum = CURDATE()
das zweite war kann ich die ausgabe auf ne punktzahl beschränken,... in jeder frage gibt es auch den wert punkte,... kann ich in der ausgabe auch durch ner variablen $punkte = "2"; angeben das er jetzt nur die fragen mit den punkten 2 anzeigt?
Im äußeren Select:
Code:
...WHERE b.beantwortet=0 AND q.punkte=$punkte
das müsste ja beides auf das selbe rauslaufen, zumindest so ca. aber wie ich das dann einfüge und vorallem beides,... mit AND?
Nicht ganz, da ja das Datum in der statsdb steht, die punkte aber in der quizdb. Die Abfrage von statsdb erfolgt im Subselect, die Abfrage von quizd im äußeren Select.
 
Zurück