embee: mySQL Denkproblem: Zwei Tabellen

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!

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

    1. 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 :)

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

        1. Hi,

          Danke, klappt bestens!