[SQL allgemein] Komplizierte Abfrage mit SQL

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

  • [SQL allgemein] Komplizierte Abfrage mit SQL

    Hallo,

    Ich habe folgende Tabellen

    ==========
    thema
    ==========
    id_thema
    bezeichnung
    ==========
    ==========


    ==========
    eintrag
    ==========
    id_eintrag
    text
    datum
    absender
    id_thema
    ==========
    ==========

    id_thema wird im "thema" gebildet und in "eintrag" verknüpft.

    Ich möchte folgende Abfrage machen. Jedes Thema auslesen und zu jedem Thema den aktuellsten Beitrag mit datum, text, absender, bezeichnung(thema) auslesen. Aber leider komme ich nicht weiter.

    Hier meine Abfrage, die leider fehlerhaft ist:

    SELECT e.id_eintrag, e.text, max(e.datum) as zeit, e.absender, t.bezeichnung, t.id_thema
    FROM thema t, eintrag e
    WHERE e.id_thema=t.id_thema
    GROUP BY t.id_thema
    ORDER BY zeit DESC

    Bin für jede Hilfe dankbar, denn trotz ewigen Selbstversuchen komme ich nicht weiter...

  • #2
    wenn du zu jedem thema den letzen punkt haben willst, musst du es in einer schleife abfragen.

    ansonsten kannst du hiermit die letzen fünf punkte incl deren thema zeigen. das halt ich wohl eher für sinnvoller...

    Code:
    SELECT 
        E.datum,
        E.text,
        E.absender,
        T.bezeichnung
    FROM
        eintrag E 
            LEFT JOIN thema T USING(id_thema)
    ORDER BY
        E.datum DESC
    LIMIT 5
    datum muss natürlich vom type DATETIME, DATE oder TIMESTAMP sein.

    aber auf keinen fall ein VARCHAR!
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Danke für die schnelle Antwort, aber das funktioniert leider nicht so wie es soll. Das LIMIT habe ich entfernt, weil ich mehr als 5 Datensätze benötige, weiter werden bei dieser Abfrage die Datensätze nicht richtig geordnet.

      Nochmal zu meinem Anliegen.
      Es gibt x Themen und x Einträge zum Thema, es soll jeweils zu einem Thema der aktuellste Beitrag angezeigt werden. Dabei soll es egal sein wie viele Beiträge zu einem Thema vorhanden sind.

      Kommentar


      • #4
        Original geschrieben von Abraxax
        wenn du zu jedem thema den letzen punkt haben willst, musst du es in einer schleife abfragen.
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          wahrscheinlich nur mal richtig gruppieren und lass mal das AS weg das is ja mal ne unschöne Angewohnheit
          Code:
          SELECT 
              e.id_eintrag, 
              e.text, 
              max(e.datum) zeit, 
              e.absender, 
          	t.bezeichnung, 
          	t.id_thema
          FROM 
          	thema t, 
          	eintrag e
          WHERE 
          	e.id_thema = t.id_thema
          GROUP BY 
              e.id_eintrag, 
              e.text, 
              e.absender, 
          	t.bezeichnung, 
          	t.id_thema
          ORDER BY 
          	zeit DESC
          Beantworte nie Threads mit mehr als 15 followups...
          Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

          Kommentar


          • #6
            @mello
            sind die joins mittels INNER JOIN oder z.b. LEFT JOIN nicht schneller, als erst das karthesische produkt zu bilden und dann mittels where einzuschränken?


            das mit dem MAX() ist ne gute lösung. warum komme ich da nur nicht drauf.
            ich mache wohl noch zu wenig damit.
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              der Query von MelloPie macht doch im Prinzip nix anderes als der ursprüngliche von sandino, außer dass noch nach weiteren Spalten gruppiert wird. Deshalb bezweifel ich, dass der besser funktioniert.

              die einfachste lösung für das Problem ist es, in der tabelle thema noch ein feld id_letzter_eintrag einzufügen.

              @abraxax
              guck dir ma den ersten post an, da steht das mit dem max() schon drin
              hopka.net!

              Kommentar


              • #8
                @haxe
                1. frage is ne gute Frage, ich mach das normalerweise fall abhängig in MySQL.
                Oracle kennt dieses join blabla zum beispiel nicht.
                2. Frage tja :-)
                Beantworte nie Threads mit mehr als 15 followups...
                Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                Kommentar


                • #9
                  @hopka na zumindest gruppiert meine query regelgerecht und nicht wies gerade beliebt...
                  Beantworte nie Threads mit mehr als 15 followups...
                  Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                  Kommentar


                  • #10
                    hmm, was verstehst du unter regelgerecht ?

                    ich hätte jetzt z.B. nur nach den IDs gruppiert.
                    hopka.net!

                    Kommentar


                    • #11
                      OffTopic:
                      @mello && hopka
                      macht mich nur fertig ...
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar


                      • #12
                        man sollte und unter jeder anständigen datenbank muss man das auch immer nach allen single cols gruppieren bei der NUtzung von aggregatsfunktionen. Weil sonst das Ergebnmis nicht wirklich richtig ist.
                        Beantworte nie Threads mit mehr als 15 followups...
                        Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                        Kommentar


                        • #13
                          @melloPie
                          Danke für deinen Lösungsansatz, freut mich, dass ich hier so ein reges Treiben erzeugt habe, aber deine Lösung funktioniert ebenso wenig wie die Andere, leider. Mit dieser Abfrage werden alle Datenträge ausgelesen und sortiert, aber das GROUP bildet nicht nur den aktuellsten Eintrag sonder alle, und das bringt nichts. Ich brauche ja nur einen Beitrag.

                          Bei meinem Beispiel habe ich 6 Themen angelegt und zu diesen Themen wird diskutiert, d.h. es sind mehrere Einträge zu einem Thema vorhanden und diese von zu unterschiedlicher Zeit. Das Problem ist ja wenn ein 2 Beiträge zu einem Thema aktueller sind als ein Eintrag zu einem anderen Thema, dann erscheint ein Thema 2x und das ist falsch.

                          Ich hänge echt schon seit längerer Zeit an diesem Problem, hoffentlich bekomme ich hier einen richtigen Lösungsweg.

                          Kommentar


                          • #14
                            hm stimmt schon, hatte Deine grosse Query gelesen und dachte völlig falsch gruppiert.
                            Wenn man davon ausgeht, dass Du keine subselcts benutzen kannst, musst Du zwei queries machen.
                            Die eine holt Dir das MAX(datum) mit den IDs der einträge die zweite holt Dir die daten dazu...
                            Beantworte nie Threads mit mehr als 15 followups...
                            Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                            Kommentar


                            • #15
                              Ich möchte mal eben einen sehr klugen Menschen zitieren - mich :
                              Original geschrieben von Hopka
                              die einfachste lösung für das Problem ist es, in der tabelle thema noch ein feld id_letzter_eintrag einzufügen.
                              Das wird von allen Board-Systemen, von denen ich mir den Quelltext angesehen hab so gemacht (phpBB, YaBB-SE, Invisionboard).
                              hopka.net!

                              Kommentar

                              Lädt...
                              X