Veröffentlicht 5. Juli 200421 j hi und hallo, ist mir sehr peinlich, aber ich habe echt ein problem die richtige mysql-abfrage zu folgendem problem zu finden. (ich glaube mir fehlt irgend ein keyword...) tabellen 1.fragen id (PS) text 2.antworten id (PS) fragenID text 3.benutzerantworten fragenID antwortID benutzerID es ist ein ganz einfaches umfragesystem jeder benutzer soll zu jeder frage genau eine antwort geben können danach ist die frage für ihn nicht mehr sichtbar (er kann sich nur noch die auswertung anschauen) ich benötige nun eine mysql-abfrage um herauszufinden welche FRAGEN ein benutzer noch nicht beantwortet hat. beispiel: benutzer 1 hat von 6 existenten fragen frage 1 und 3 bereits beantwortet. die abfrage soll mir nun liefern, dass er frage 2,4,5 und 6 noch nicht beantwortet hat. *schämeinbisserl* vielen dank im voraus
5. Juli 200421 j hmm... SELECT id FROM fragen WHERE id NOT IN (SELECT fragenid FROM benutzerantworten WHERE benutzerid = 1) sollte dein Problem lösen, denk ich mal.
5. Juli 200421 j aber in mysql gibt es leider nicht die möglichkeit select statements zu verschachteln...
5. Juli 200421 j ich dachte in der 4 geht das...... ? SELECT column1,column2,column3 FROM t1 WHERE (column1,column2,column3) IN (SELECT column1,column2,column3 FROM t2); geht laut Doku von mysql.org siehe: http://dev.mysql.com/doc/mysql/en/Row_subqueries.html John
5. Juli 200421 j hmm... SELECT id FROM fragen WHERE id NOT IN (SELECT fragenid FROM benutzerantworten WHERE benutzerid = 1) sollte dein Problem lösen, denk ich mal. das sollte auch gehen
5. Juli 200421 j 1. Möglichkeit: ein LEFT JOIN von Fragen auf Benutzeranatworten, in der Where-Bedingung prüfst du ob benutzerantworten.fragenid IS NULL 2. Möglichkeit: ein RIGHT JOIN von den Antworten zu den Fragen, gleiches Vorgehen
5. Juli 200421 j hmm, also ich glaube ich sollte heim und ab ins bett. bei mir will das nicht. ich habe mysql version 4.0.17. ganz komisch alles...
5. Juli 200421 j also das verschachteln geht nicht, aber enricos lösung geht!!!! danke danke danke vielmals. echt.
5. Juli 200421 j ah ne leider doch nicht. bei der abfrage von enrico ist der benutzer an sich (mit benutzerID) nicht drin...da beiss ich mir gerade die zähne aus...
6. Juli 200421 j @enrico: hmm, aber dann bekomme ich ja wieder antworten die der benutzer schon gegeben hat!? und nochmal zu den subqueries. ich probiere folgendes (ganz einfach, hat mit der sache nix zu tun!) SELECT id FROM benutzer WHERE id IN ( SELECT benutzerID FROM umfrage_userantworten ) also alle benutzer, die eine antwort gegeben haben. aber da kommt bei mir immer: (standard error) "#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT benutzerID" wie gesagt mysql 4.0.17 ahhhhhhhhhhhhhhhhhhhhhhhhh!
6. Juli 200421 j @enrico: hmm, aber dann bekomme ich ja wieder antworten die der benutzer schon gegeben hat!? und nochmal zu den subqueries. ich probiere folgendes (ganz einfach, hat mit der sache nix zu tun!) SELECT id FROM benutzer WHERE id IN ( SELECT benutzerID FROM umfrage_userantworten ) also alle benutzer, die eine antwort gegeben haben. aber da kommt bei mir immer: (standard error) "#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT benutzerID" wie gesagt mysql 4.0.17 ahhhhhhhhhhhhhhhhhhhhhhhhh! gibts in der Tabelle "umfrage_userantworten" eine spalte "benutzerID"?
6. Juli 200421 j jede einzelne abfrage für sich geht ja: SELECT id FROM benutzer WHERE id IN ( 1, 2, 3) UND SELECT benutzerID FROM umfrage_userantworten gehen beide...
6. Juli 200421 j töröööööö! daran liegts also dann werde ich mir die mal draufpacken. vielen dank! eine anschliessende frage hätte ich aber nopch. OT sozusagen, bidde nicht schimpfen: finde ich die von meinem provider verwendete mysql in der phpinfo?? da sehe ich folgenden wert: MYSQL Client API version 3.23.49 heisst das, dass der provider mit der version 3.23.49 arbeitet, oder gibt der wert für API version irgend entwas anderes an...? EDIT: sehe gerade, dass die 4.1 ja erst ne beta ist. hilft mir also im mom nicht weiter. vielleicht weiss doch noch jemand nen weg wie mans ohne subqueries lösen kann...
6. Juli 200421 j Muss denn umbedingt eine SQL Anweisung sein? Mach doch zwei draus. Erst ermittelst Du alle Fragen und danach prüfst Du bei jeder Frage ob der User diese schon beantwortet hat. Oder Du ermittelst erst alle Fragen die der User beantwortet hat und dann läst Du dir nur noch die Fragen ausgeben die er noch nicht beantwortet hat. WHERE fragen NOT in (1, 4, 5, 9) Frank
6. Juli 200421 j das ist völlig richtig, und leider werde ich es auch so machen müssen wies aussieht. ich wollte nur gerne eine saubere einfache (im doppelten sinne;)) und schnelle sache machen. aber du hast recht: davon hängt ja der erfolg nicht ab. vielen dank an alle!
6. Juli 200421 j Wie sieht denn aktuell deine Anfrage aus? Wenn du noch ein Feld brauchst, dann nimm es doch einfach noch im Select mit auf.
6. Juli 200421 j @enrico meine abfrage ist noch deine erste (der left join) aber wenn ich benutzerID mit aufnehme, dann bekomme ich eben wieder fragen die der benutzer schon beantwortet hat. wenn ich nicht nach benutzerID abfrage, dann bekomme ich alle benutzerantworten, also auch bei benutzer 1 die beantworteten von benutzer 2. heisst, dass obwohl benutzer 1 z.b. frage 1 noch nicht beantwortet hat er die frage nicht mehr bekommt weil benutzer 2 frage 1 schon beantwortet hat. alles verwirrend. sorry
6. Juli 200421 j SELECT fragen.id, antworten.benutzerid FROM fragen LEFT JOIN benutzerantworten as antworten ON fragen.id = antworten.fragenid WHERE antworten.benutzerid = 1 So besser?
6. Juli 200421 j und das ganze nun negiert! denn jetzt bekomme ich ja wieder die fragen die der benutzer mit der id 1 bereits beantwortet hat... langsam wirds arg. bidde enrico, stress dich nicht wegen mir!!! (schön wärs natürlich schon wenn ich noch ne lösung finde )
6. Juli 200421 j SELECT fragen.id, antworten.benutzerid FROM fragen LEFT JOIN benutzerantworten as antworten ON fragen.id = antworten.fragenid WHERE antworten.benutzerid = 1 AND antworten.fragenid IS NULL
6. Juli 200421 j leider auch nicht, denn wenn benutzerID 1 ist UND antworten.fragenID NULL kriege ich leider gar keine unbeantwortete frage, da beides gleichzeitig nicht zutreffen kann. (ich meine benutzerID = x AND fragenID = NULL)...
6. Juli 200421 j Man, ich steh aber auch aufm Schlauch. Kannst du mal nen Dump machen und per email schicken?
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.