schwieriger join

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

  • schwieriger join

    Hallo Gemeinde,

    bin neu hier und möchte gleich ein problem zur bewältigung bereitstellen ;-).... *hoffe ihr verzeiht mir das...

    Grundsätzliches (um was es geht):
    1. Forumscript (PHP5/MySQL)
    2. Forum hat Hauptebene und eine Unterebene
    3. in der Hauptebene soll, neben dem Thread, das Datum des letzten eintrages/eintragenden stehen

    und genau da (3) liegt das problem....

    um mein forumscript sehr schnell und funktionell zu halten habe ich folgende tabellen in der db erstellt:

    - "forum" (hier sind id, threadtitel, ersteller, erstellerdatum sowie lese und antwortzähler enthalten)

    - "forum_threads" (hier sind lediglich die id(primär), tid(id "forum") und inhalt des threads)....

    - "forum_reps" (hier sind die enstprechenden antworten mit den jeweiligen id´s zur forum-tabelle mit timestamp hinterlegt(id,tid,name,inhalt,timestamp)......


    im hauptforum, also erste ebene lese ich die inhalte der tabelle "forum" aus, sortiere sie und zeige sie tabellarisch an.....
    nun möchte ich über einen join in der hauptabfrage jedoch zusätzlich die tabelle "forum_reps" abfragen ("forum"-id = "forum_reps"-tid), dort aber nur den timestamp des letzten beitrages zur entsprechnden id von "forum"

    bsp.:

    "forum":
    id: 1
    thread: "hallo hallo"
    views: 6 (so oft angesehen)
    replys: 2 (so oft geantwortet)
    timestamp: 1142543627
    erstellername: "derJenige"
    erstelleremail: "hallo@hallo.de"


    diese tabelle wird also als root-tabelle ausgegeben, wobei man auf den thread-titel ("hallo hallo") klicken kann und man so in die zweite eben kommt.....

    "forum_thread":
    id: (auto_incr)
    tid: 1 (id in "forum")
    inhalt: "dies ist der Inhalt zum beitrag Hallo Hallo...... und hiermit möchte ich mein persönliches HALLO verkünden"


    "forum_reps":
    id: (auto_incr), hier mal: 1
    tid: 1 ("forum"-id)
    antworttitel: "auch hallo"
    antwortinhalt: "auch ich verkünde hier mein persönliches HALLO"
    antworterstellername: "ich"
    antworterstelleremail: "ich@ich.de"
    timestamp: 1142543686

    id: (auto_incr), hier mal: 2
    tid: 1 ("forum"-id)
    antworttitel: "ebenso hallo"
    antwortinhalt: "und auch ich will mal HALLO sagen"
    antworterstellername: "auchich"
    antworterstelleremail: "auchich@ichauch.com"
    timestamp: 1142596578



    nun möchte ich also mit einer abfrage:

    select(from a.*, b.timestamp, b.erstellername from forum a LEFT/RIGHT/INNERjoin forum_reps b ON ....... <- Hier fehlt mir der Rest....

    erreichen, das er mir alle "forum" datensätze zuzüglich des höchsten timestamps mit zugehörigem ersteller aus "forum_reps" ausgibt

    hoffe, ich hab nicht zu sehr übertrieben mit den erklärungen......


    vorweg besten dank für jedwede hilfe und aufklärung...... gibt es vielleicht irgendwo join-tut´s von begin bis ins tiefgründigste detail ? (damit meine ich nicht die man von mysql)......


    beste grüße, Andreas, alias IceX77

  • #2
    Hi,

    ungetestet und nur als idee

    Code:
    SELECT  a.*,MAX(b.timestamp) AS highest,b.erstellername
       FROM forum
          LEFT JOIN forum_reps AS b ON tid = id
       GROUP BY highest
    Der left join ist nötig, da es ja auch threads gibt auf die keine
    antworten existieren. Wenn du aggregates mit anderen tupeln
    mischst musst du das ergebnis gruppieren.

    Vll ist das eine idee...

    greets
    Zuletzt geändert von closure; 29.03.2006, 09:03.
    (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

    Kommentar


    • #3
      geht so irgendiwe gar nicht....

      hi,

      ersteinmal danke für die rasche hilfe, und respekt gegenüber deinem wissen....

      habe versucht deinen query in meinen script einzubauen.... aber irgendwie will es so nicht funktionieren.... nun findet er gar keine datensätze, aber auch keine fehler im script..... ich poste mal den ursprungsquery, und den neuen:


      Ursprung:

      "SELECT * FROM necc_forum $ergquery ORDER BY oi DESC, newts DESC LIMIT ".$start.", ".$limit.""

      (im $ergquery steht eine per script aufgebaute where-anweisung die nach zeiträumen filtert, ebenso werden $start und $limit dynamisch erzeugt....)


      die neue query (welche mit sicherheit total daneben ist ;-)):

      "SELECT a.*, MAX(b.ts) AS highest, b.user AS auser FROM necc_forum AS a LEFT JOIN necc_forum_reps AS b ON a.id=b.tid GROUP BY highest $ergquery ORDER BY a.oi DESC, a.newts DESC LIMIT ".$start.", ".$limit.""


      wie muss ich vorgehen..... wo liegt mein denkfehler,..... oder denke ich sowieso zu kompliziert ????!!!!!!



      beste grüße, und wieder vielen dank vorweg.....



      Andreas alias iceX


      -----------------------------------------------------------------------------

      Das Licht am Ende des Tunnel kann auch ein Zug sein....... ;-)
      Zuletzt geändert von iceX77; 29.03.2006, 21:36.

      Kommentar


      • #4
        achso....

        noch kurz erklärt:


        da in tabelle "forum" und "forum_reps" die spalten user und ts(timestamp) vorkommen habe ich den user über AS umbenannt, um später im array an seinen namen zukommen




        best greets, iceX

        Kommentar


        • #5
          Hi,

          also ich würde das ganze zunächst mal nicht im program
          testen sondern via phpmyadmin oder query-browser oder
          commandozeile oder wie auch immer.

          Eine zweite überlegung die man anstellen kann, ob es
          nicht wesentlich stressfreier ist, das ganze nicht mit
          einer abfrage zu lösen sondern mit 2en. Die erste
          holt dann die threads mit den antworten usw.
          und die zweite holt den datensatz mit dem höchsten timestamp.

          Oder willst du zu jedem thread, alle antworten und die antworten
          sollen nach timestamp geordnet sein ?

          greets
          (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

          Kommentar


          • #6
            gelöst....

            mit folgender query:


            "SELECT a.*, MAX(b.ts) AS highest, b.user AS buser FROM forum AS a LEFT JOIN forum_reps AS b ON b.tid=a.id WHERE hiddenthread='0' GROUP BY a.id ORDER BY a.oi DESC, a.newts DESC LIMIT ".$start.", ".$limit.""


            nur für alle dies interessiert........




            beste grüße, iceX

            Kommentar

            Lädt...
            X