mySQL Denkproblem: Zwei Tabellen
embee
- datenbank
0 Vinzenz Mai0 embee0 Vinzenz Mai0 embee
Hallo,
Ich weiss nicht, wie ich mit mySQL 3.23 an folgendes Ziel komme:
Ich habe eine Tabelle, die jede Menge Quizfragen enthält. Diese sind Unique. Um zu tracken, ob ein User eine Frage bereits beantwortet hat, speichere ich in der zweiten Tabelle die Frage-ID und die User-ID, wenn er diese schon beantwortet hat.
+----------+---------+
| frage_id | user_id |
+----------+---------+
| 15 | 249439 |
| 5 | 249439 |
| 4 | 249439 |
| 6 | 249439 |
| 8 | 249439 |
+----------+---------+
Habe schon mit JOIN und allem möglichem rumprobiert, aber irgendwie scheint es nicht zu klappen. Ich glaube, man müsste so etwas über Sub-Querys lösen, welche aber ja in meiner mySQL-Version nicht unterstützt werden.
Zur Zeit sieht meine Abfrage so aus:
SELECT a.frage_id,a.Frage,a.RichtigeAntwort,b.frage_id,b.user_id
FROM fragen_extern AS a
LEFT JOIN user_antworten as b ON a.frage_id=b.frage_id
WHERE b.user_id!=$uid
Glaube aber, dass ich voll nicht mehr den Durchblick habe und das komplett falsch gedacht ist.
Danke für eure Hilfe!
Hallo
Ich weiss nicht, wie ich mit mySQL 3.23 an folgendes Ziel komme:
eine sehr alte Version. Würde ich mir nicht mehr bieten lassen.
Ich habe eine Tabelle, die jede Menge Quizfragen enthält. Diese sind Unique. Um zu tracken, ob ein User eine Frage bereits beantwortet hat, speichere ich in der zweiten Tabelle die Frage-ID und die User-ID, wenn er diese schon beantwortet hat.
+----------+---------+
| frage_id | user_id |
+----------+---------+
| 15 | 249439 |
| 5 | 249439 |
| 4 | 249439 |
| 6 | 249439 |
| 8 | 249439 |
+----------+---------+Habe schon mit JOIN und allem möglichem rumprobiert, aber irgendwie scheint es nicht zu klappen. Ich glaube, man müsste so etwas über Sub-Querys lösen,
"klappt nicht" ist keine Fehlerbeschreibung.
Was, bitte, ist überhaupt Dein Ziel?
Welches Problem hast Du, dieses zu erreichen?
Kein Code bitte, sondern eine Beschreibung in Text.
Freundliche Grüße
Vinzenz
Hi,
eine sehr alte Version. Würde ich mir nicht mehr bieten lassen.
Leider will es mein Arbeitgeber so :-)
"klappt nicht" ist keine Fehlerbeschreibung.
Was, bitte, ist überhaupt Dein Ziel?
Ziel: Ich möchte wissen, welche von 20'000 Fragen in einer Tabelle ein User XY schon beantwortet hat. Darum gibt es zwei Tabellen: Eine mit den Fragen, die andere mit frage_id und user_id. Sind diese gesetzt, hat der User die Frage schon beantwortet. Daher sollten diese nicht mehr ausgelesen werden.
Welches Problem hast Du, dieses zu erreichen?
Grundsätzlich wäre es ganz einfach:
SELECT fragen.frage_id,user.frage_id,user.user_id
FROM fragen,user
WHERE fragen.frage_id != user.frage_id
AND frage.user_id != user.user.id
Ausgedeutsch: Hole Frage-ID von Fragen-Tabelle und Frage-ID von beantworteten Fragen sowie User-ID von beantworteten Fragen. Wenn Frage-ID und Frage-ID von beiden Tabellen und der User-ID nichts zurückgeben, dann wurde die Frage noch nicht beantwortet.
Kein Code bitte, sondern eine Beschreibung in Text.
Naja, ich hoffe ich konnte mich verständlich ausdrücken :)
Hallo
eine sehr alte Version. Würde ich mir nicht mehr bieten lassen.
Leider will es mein Arbeitgeber so :-)
"klappt nicht" ist keine Fehlerbeschreibung.
Was, bitte, ist überhaupt Dein Ziel?Ziel: Ich möchte wissen, welche von 20'000 Fragen in einer Tabelle ein User XY schon beantwortet hat.
das wäre ein einfacher Join. Wo ist das Problem?
Darum gibt es zwei Tabellen: Eine mit den Fragen, die andere mit frage_id und user_id. Sind diese gesetzt, hat der User die Frage schon beantwortet. Daher sollten diese nicht mehr ausgelesen werden.
Welches Problem hast Du, dieses zu erreichen?
Grundsätzlich wäre es ganz einfach:
SELECT fragen.frage_id,user.frage_id,user.user_id
FROM fragen,user
WHERE fragen.frage_id != user.frage_id
AND frage.user_id != user.user.idAusgedeutsch: Hole Frage-ID von Fragen-Tabelle und Frage-ID von beantworteten Fragen sowie User-ID von beantworteten Fragen. Wenn Frage-ID und Frage-ID von beiden Tabellen und der User-ID nichts zurückgeben, dann wurde die Frage noch nicht beantwortet.
Nein, genau diesen Unsinn wollte ich nicht haben. Er läßt mich aber vermuten, dass Du im Gegensatz zu Deiner Problembeschreibung genau _die_ Fragen haben möchtest, die ein Benutzer noch _nicht_ beantwortet hat.
Kein Problem, auch nicht mit MySQL 3.23.x. Ein einfacher LEFT JOIN mit einer einfachen WHERE-Klausel:
SELECT -- Gib mir
f.frage_id, -- id der Frage
f.frage -- sowie Text
FROM -- aus
fragen f -- allen Fragen, verknüpft
LEFT JOIN
user_antworten ua -- mit den bisher gegebenen Antworten
ON -- wobei die Verknüpfung über
f.frage_id = ua.frage_id -- die id der Frage erfolgt
AND -- und auf die id
ua.user_id = <id der Person> -- der bestimmten Person geprüft wird,
WHERE -- und zu denen in der Antwortentabelle
ua.frage_id IS NULL -- kein passender Datensatz vorhanden ist.
Dabei ist es wichtig, die Einschränkung der user_id in die Joinbedingung zu nehmen, da die user_id bei nicht beantworteten Fragen ebenfalls NULL liefert. Siehe dazu auch meine Ausführungen in diesem Archivposting.
Freundliche Grüße
Vinzenz
Hi,
Danke, klappt bestens!