[MySQL 4.1] Joins und Group by und Order und Max ...

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

  • [MySQL 4.1] Joins und Group by und Order und Max ...

    Hallo SQL-Könner ...

    Ich bin hier kurz vor der Verzweiflung. Es geht um eine Abfrage aus (nur) 3 Tabellen, einer Sortierung und einer Gruppierung. (Ja, ich habe schon gesucht, eine Woche lang in zig Foren und Tutorials, aber leider nichts gefunden.)

    Zuerst mal die (vereinfachte) TBL-Struktur:

    TBL_USER (Tabelle mit den Usern)
    u_id (int)
    u_nick (varchar)

    TBL_THEMEN (Tabelle mit den Threads)
    fo_id (int)
    th_id (int)
    th_last_user (int)
    th_titel (varchar)

    TBL_POSTINGS (Tabelle mit den Postings)
    th_id (int)
    po_id (int)
    po_zeit (datetime)

    Ich möchte nun eine Übersicht aller Foren haben. Jedes Forum soll nur einmal erscheinen und zwar mit dem Thread, in dem als letztes gepostet wurde. Dazu natürlich der passende (neueste) Verfasser und die passende (neueste) Zeit, sowie die Anzahl der Postings in diesem Thema. Im Prinzip also etwas, das man in fast jedem größeren Forensystem findet. Nur kann ich mir da leider keine Query abschauen, weil die Strukturen der Tabellen vollkommen anders sind und ebenso das Prinzip.

    Meine Querys sahen bis jetzt in etwa so aus. (Ich habe natürlich intensiv herumexperimentiert.)

    SELECT
    t.fo_id, t.th_id, t.th_titel, u.u_nick, max(p.po_zeit) as maxzeit, count(p.po_id) as pozahl
    FROM
    tbl_user u, tbl_themen t, tbl_postings p
    WHERE
    t.th_id=p.th_id AND p.u_id=t.th_last_user
    GROUP BY
    t.fo_id
    ORDER BY
    maxzeit DESC

    Bei dieser Abfrage zählt er leider alle Postings zusammen, nicht die des aktuellsten Threads. Er spuckt auch einen belibiegen Titel heraus, dazu den falschen Nick und die absolut falsche Zeit. Es passt also nichts zusammen.
    Wenn ich GROUP BY t.fo_id, t.th_id mache, erhalte ich leider alle Themen (t.th_id) eines jeden Forums (t.fo_id).

    Abfrage 2:

    SELECT
    t.fo_id, t.th_id, t.th_titel, count(p.po_id) as pozahl, u.u_nick, max
    (p.po_zeit) as maxzeit
    FROM
    tbl_postings as p
    RIGHT JOIN
    tbl_themen as t ON p.th_id=t.th_id
    LEFT JOIN
    tbl_user as u ON p.u_id=t.th_last_user
    GROUP BY
    t.fo_id
    ORDER BY maxzeit DESC

    Hier erhalte ich das absolute Chaos, das ich absolut nicht verstehen kann. Wenn ich hinten dran noch eine WHERE-Abfrage dranhänge, die so aussieht, wie die von der ersten BSP-Query, erhalte ich ebenfalls dasselbe Ergebnis, wie in der ersten Query ...

    Ich habe schon mit allen möglichen Kombinationen aus LEFT und RIGHT JOIN experimentiert und auch mit reinem JOIN, aber es ist immer dasselbe.

    Ich habe auch eine zusätzliche Tabelle angelegt

    TBL_FOREN
    fo_id (int)

    und diese in verschieden Query-Anordnungen einbezogen, jedoch ebenfalls ohne Erfolg

    Es wäre absolut toll, wenn mir jemand helfen könnte. Vielen Dank schon im Vorraus.

  • #2
    hmm,

    kannst du mal nen dump der tabellen posten, mit ein paar beispiel-ds (notfalls anhängen)? dann brauch ich mir das jetzt nicht ausdenken (oder selber schreiben), sondern kanns testen ...

    gibts noch ne tabelle für die foren?
    muß die spalte th_last_user (int) in vorhanden sein? der letzte user läßt sich doch aus den posts erkennen ...?
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      schau dir mal http://php-resource.de/forum/showthr...threadid=31056 an, vielleicht hilft's dir weiter
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        @mrhappiness:
        Deine Lösung aus dem anderen Thread sieht wirklich interessant aus, nur kann ich sie nicht auf 3 (oder gar 4) Tabellen portieren. Zumindest wüsste ich nicht, wie. Ich muss auch ehrlich sagen, dass ich die Lösung (im Bezug auf das dortige Problem) nicht verstehe.

        (@derHund
        Aber: Ich hatte ebenfalls das Problem, die Top 20 Themen eines Forums auszugeben, sortiert nach dem aktuellsten Posting eines Themas. Das hat leider nicht geklappt, weshalb ich dann zustätzlich die Spalte th_last_user (im nachfolgenden Dump alias th_aktion) einfügen musste.
        Ich habe nun versucht, deine Lösung aus dem anderen Thread auf mein Problem zu beziehen, was jedoch auch nicht geklappt hat.

        @derHund:
        Ich füge nun ein ZIP-Archiv an. Es beinhaltet Dumps der Tabellen User, Themen (Threads) und Postings. Und zusätzlich noch die Hilfstabelle mit den Foren, die jedoch eigentlich nicht benötigt wird. (Die Foren sind in einem Array einer Sprachdatei gespeichert, da das Zeug mehrsprachig werden soll.)

        Und hier mal die Query, wie sie eigentlich bei mir lautet (was nicht so ist, wie ich es Anfangs haben wollte), zur Abfrage der aktiven Themen eines bestimmten Forums:

        select t.th_id, t.th_status, t.th_kat, t.th_titel, t.th_hits, count(p.po_id) as pozahl, t.th_aktion, p.u_id, u.u_nick, max(p.po_zeit) as maxzeit from tbl_co3_foren_po p, tbl_co3_user_daten u, tbl_co3_foren_th t where t.th_aktion = u.u_id and t.th_id = p.th_id and t.fo_id=1 and (t.th_sprache<>99) and (p.po_status=1 or p.po_status=3) and t.th_status>0 group by t.fo_id, p.th_id order by maxzeit desc

        Diese Abfrage liefert das gewünschte Ergebnis, jedoch eben mit diesem zusätzlichen Feld "th_aktion" bzw. in der vereinfachten Query meines Anfangsposts als "th_last_user" bezeichnet. (Dieses Feld benötigte ich Anfangs nur, um dort festzuhalten, von welchem Moderator ein Thema z.B. geschlossen oder gelöscht wurde, oder wer es wiedergeöffnet oder wiederhergestellt hat.)

        Aber das soll jetzt mal nicht das Problem sein, sondern halt die Abfrage EINES Themas PRO Forum in einer Übersicht der aktuellsten Themen, sortiert.

        Vielen Dank fürs Lesen

        DasD
        Angehängte Dateien

        Kommentar


        • #5
          Code:
          SELECT 
            f.forum_name, u.username, t.thread_name
          FROM 
            forentabelle f
            INNER JOIN threadtabelle t ON f.forum_id=t.forum_id
              LEFT JOIN thread_tabelle t_dummy
              ON
                t.thread_id=t_dummy.thread_id
                AND
                t.datum<t_dummy.datum
              INNER JOIN usertabelle u ON t.user_id=u.user_id
          WHERE
            t_dummy.thread_id IS NULL
          kannst du sowas mal probieren

          hab mir deinen beitrag nicht ganz durchgelesen, aber das sieht für mich recht logisch aus (was nix heißen muss *g*)
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar

          Lädt...
          X