Vinzenz Mai: mySQL Denkproblem: Zwei Tabellen

Beitrag lesen

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.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.

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