Ankündigung

Einklappen
Keine Ankündigung bisher.

Abfrage über 4 Tabellen um phpbb Forum nach Drupal umzuziehen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Abfrage über 4 Tabellen um phpbb Forum nach Drupal umzuziehen

    Hallo zusammen,

    ich bin gerade dabei mein phpbb Forum in das Drupal-CMS zu integrieren.

    Jedes Thema wird in der Tabelle phpbb_topics gestartet und erhält dort (u.a.) einen Eintrag des beginnenden Posts in der Spalte phpbb_topics.topic_first_post_id.

    Die Topics konnte ich relativ problemlos abfragen und habe sie in die Drupal-Tabelle importieren können. Bei den Antwort-Posts auf die Topics tue ich mich sauschwer. Ich krieg die Abfrage einfach nicht hin. Sinngemäß sollen nur diejenigen Posts angezeigt werden, die nicht als topic_first_post gelistet sind, weil ich die ja bereits importiert habe. Bei Drupal wird unterschieden zwischen (Node = Topic und comment = post). In der (Zieltabelle) comments-tabelle brauche ich erschwerenderweise auch noch den Usernamen, usw. usw.

    Bei der folgenden Abfrage zeigt er mir 260.179 Datensätze der 260.195 Datensätze von phpbb_posts-Tabelle an:

    Code:
    SELECT
    '0' AS pid,
    phpbb_posts.poster_id AS uid,
    phpbb_posts_text.post_subject AS subject,
    phpbb_posts_text.post_text AS comment,
    phpbb_posts.post_time AS timestamp,
    '0' AS status,
    '1' AS format,
    phpbb_users.username AS name
    FROM phpbb_posts_text INNER JOIN phpbb_posts
    ON (phpbb_posts_text.post_id=phpbb_posts.post_id)
    INNER JOIN phpbb_users
    ON (phpbb_posts.poster_id = phpbb_users.user_id)
    WHERE exists ( SELECT phpbb_posts.post_time, phpbb_topics.topic_time FROM phpbb_posts, phpbb_topics WHERE phpbb_posts.post_time!=phpbb_topics.topic_time)
    Ich brauch's aber ja genau umgekehrt. Er soll mir ja nur die Teilmenge an Posts anzeigen, die nicht als Themenstarter in der Tabelle phpbb_topics gelistet sind.

    Ich erspare Euch mal die ganzen Versuchsabfragen

    Entweder das Ergebnis war Null, oder ich erhielt dann um die 4.400 Datensätze aus der phpbb_topics-Tabelle, die tatsächlich 4.415 Datensätze enthält.

    Ich hoffe ich konnte mein Problem einigermaßen veranschaulichen

    Viele Grüße

    Matthias


  • #2
    Vielleicht sind Differenz-Posts von einem User, den es nicht mehr gibt?
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Ich dachte das die in der Bedingung enthaltene Unterabfrage

      Code:
      WHERE EXISTS (
      SELECT phpbb_posts.post_time, phpbb_topics.topic_time
      FROM phpbb_posts, phpbb_topics
      WHERE phpbb_posts.post_time != phpbb_topics.topic_time
      )
      zumindest die Teilmenge anzeigt, die nicht nicht in der Tabelle phpbb_topics enthalten ist. Ich erhalte aber wie gesagt, trotzdem 260.179 angezeigt. Anhand der Daten erscheinen auch die Topic-Starter-Posts.

      Über die 16 fehlenden Datensätze (260.179 zu 260.195) hatte ich mir noch keine Gedanken gemacht, aber das liegt vielleicht wirklich an einem nicht mehr existierenden User.

      Mir geht's im ersten Schritt aber erstmal um die o.g. Teilmenge. Liegt es vielleicht am "WHERE EXISTS", oder ist die Bedingung von vornherein zum scheitern verurteilt. "WHERE NOT EXISTS" liefert nämlich NULL zurück.

      Kommentar


      • #4
        Code:
        SELECT phpbb_posts.post_time, phpbb_topics.topic_time
        FROM phpbb_posts, phpbb_topics
        WHERE phpbb_posts.post_time != phpbb_topics.topic_time
        Schau dir einfach mal an, was die innere Abfrage an Ergebnissen ausspuckt, das ist entscheident für das Verhalten von EXISTS in der äußeren Abfrage...
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Hab ich jetzt gemacht und da kommen als Ergebnis *ähem* 1.183.362.420 Datensätze raus und zwar jeweils 4.547 x die gleiche post_id mit je einer anderen topic_id. Ich vermute, dass die Abfrage bewirkt, dass z.B. post_id 1043366488 unterschiedlich ist als topic_id 1043368026, post_id 1042266488 unterschiedlich ist als topic_id 1043366315, usw.

          Wenn ich das gleiche mit dem Feld post_id und topic_first_post_id mache, komme ich zum ähnlichen Ergebnis.

          Das ist genau mein Problem. Ich kriege die Abfrage nicht formuliert. Entweder ich bekomme die Ergebnisse multipliziert mit den gefundenen Differenzen oder ich bekomme als Ergebnis gar nichts angezeigt.

          Kommentar


          • #6
            Code:
            SELECT
            '0' AS pid,
            phpbb_posts.poster_id AS uid,
            phpbb_posts_text.post_subject AS subject,
            phpbb_posts_text.post_text AS comment,
            phpbb_posts.post_time AS timestamp,
            '0' AS status,
            '1' AS format,
            phpbb_users.username AS name
            FROM phpbb_posts_text INNER JOIN phpbb_posts
            ON (phpbb_posts_text.post_id=phpbb_posts.post_id)
            INNER JOIN phpbb_users
            ON (phpbb_posts.poster_id = phpbb_users.user_id)
            WHERE
            phpbb_posts.post_id NOT IN (SELECT post_id FROM phpbb_topics)

            sowas in der Art... kenne die Interna von phpBB nicht
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Jo, genau, hab's mit

              Code:
              WHERE phpbb_posts.post_id NOT IN (SELECT topic_first_post_id FROM phpbb_topics 
                  WHERE topic_first_post_id=phpbb_posts.post_id)
              heute nachmittag selbst gelöst. Was'n Kraftakt

              Bei > 260.000 posts und ca. 4.500 topics hat die ganze Geschichte ungefähr 20 Minuten auf meinem Laptop gerechnet.

              Kommentar

              Lädt...
              X