2 select anweisungen verschachteln

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

  • 2 select anweisungen verschachteln

    ich habe 2 select anweisungen, die jede für sich das richtige ergebnis bringen. ich will aber eine anweisung daraus machen
    1:
    PHP-Code:
    SELECT t1.*,t2.fidCOUNT(*) AS anzahl 
    FROM threads t2 INNER JOIN foren t1 ON t2
    .fid t1.id 
    GROUP BY t1
    .id 
    2:
    PHP-Code:
    SELECT fid,created AS letzter_eintrag 
    FROM answers 
    GROUP BY fid 
    Zuletzt geändert von steve-x; 19.05.2004, 22:28.

  • #2
    SELECT f.*, f.id as fid, COUNT(*) as anzahl, max(t.created) AS letzter_eintrag
    FROM foren f
    LEFT JOIN threads t on t.fid = f.id
    GROUP BY f.id
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      sorry meine angaben waren ein wenig konfus und unvollständig

      ich habe 3 tabellen:
      1. foren
      id | name | zusatz
      2. threads
      id | fid | ...

      3. answers
      id | tid | fid | ... | created

      ich will:
      tabelle 1 foren auslesen,
      anzahl der einträge threads.fid = foren.id,
      von answers.created (type: DATETIME) das letzte datum bei dem answers.fid = foren.id (geordnet nach foren.id und nur das letzte ausgeben)

      mein letzter versuch hat so ausgesehen:

      PHP-Code:
      SELECT foren.*,threads.fidCOUNT(*) AS anzahlanswers.fid,answers.created
          FROM threads 
          RIGHT JOIN foren 
              ON threads
      .fid foren.id 
              GROUP BY foren
      .id
          LEFT JOIN answers 
              ON answers
      .fid foren.id
              GROUP BY answers
      .created AS letzter_eintrag 
      gibt den folgenden fehler:
      error near: 'LEFT JOIN answers ON answers.fid = foren.id GROUP BY answers.created'
      Zuletzt geändert von steve-x; 21.05.2004, 15:41.

      Kommentar


      • #4
        rtfm

        Lies doch mal das Handbuch zum Thema select und group by-Funktionen.

        1. Die Reihenfolge stimmt nicht: das group by zwischen den beiden joins stört.
        2. Außerdem gehört ein as nicht in die group by-Klausel.
        3. Und du willst den letzten Eintrag, das ist der mit dem höchsten Datum, also benutze max!
        4. threads.fid und answers.fid kannst du dir sparen, den Wert hast du schon als foren.id
        5. count(*) wird nicht den gewünschten Wert liefern. Warum wirst du feststellen, wenn du das group by versuchsweise streichst und dir das Ergebnis für ein relativ kleines Forum anschaust. (zwei Threads mit jeweils 2-3 Antworten)

        Und last but not least ist deine DB nicht vollständig normiert. In den Antworten brauchst du die Foren-ID nicht, sondern nur die Thread-ID.
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          PHP-Code:
          SELECT foren.*, threads.fid
              
          MAX(DATE_FORMAT(answers.created'%d.%m.%Y')) AS letzter_eintrag
              
          COUNT(threads.fid) AS anzahl_themen 
          FROM threads 
          RIGHT JOIN foren ON threads
          .fid foren.id 
          LEFT JOIN answers ON answers
          .fid foren.id 
              GROUP BY foren
          .id 
          hab es auch ohne group by probiert.
          ich erhalte zwar jetzt das richtige ergebnis für das letzte datum, dafür stimmt die anzahl an themen nicht mehr

          Kommentar


          • #6
            count(distinct threads.fid) ?

            Kommentar


            • #7
              das habe ich auch schon probiert. funktioniert leider auch nicht.

              Kommentar


              • #8
                Die Ergebnisse Letzter Eintrag und Anzahl Threads kriegst Du auf jeden Fall auf diesem Wege:
                Code:
                SELECT f.id, f.name, f.zusatz, COUNT(DISTINCT t.id) anzahl, MAX(a.created) letzter_eintrag
                  FROM foren f
                  LEFT JOIN threads t
                    ON f.id = t.fid
                  LEFT JOIN answers a
                    ON t.fid = a.fid
                   AND t.id = a.tid
                 GROUP BY f.id, f.name, f.zusatz
                Nur eine ThreadID oder AnswerID wird natürlich nicht ermittelt ... !
                carpe noctem

                [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                Kommentar


                • #9
                  ja. super!

                  das ist genau das, was ich gebraucht habe. besten dank!

                  jetzt bin ich gespannt, ob ich das auf die weiteren abfragen umlegen kann.
                  hoffe ich muß euch nicht so schnell wieder belästigen.

                  Kommentar


                  • #10
                    dazu hab ich nochmal ne frage

                    ich möchte ebenfalls was aus der db auslesen mit zwei anweisungen
                    allerdings kann es nur ein ergebnis geben geht das dann nicht auch ohne group by ?

                    zum Beispiel


                    PHP-Code:
                    $sql mysql_query("SELECT * FROM tabelle WHERE farbe='$grün'");
                    $daten mysql_fetch_assoc($sql);
                    echo 
                    $daten["irgendwas"];

                    //1 anweisung :farbe='$grün'
                    //2 anweisung :chef='$chef' 
                    da es nur ein chef bei grün gibt kann ich max ein ergebnis erhalten wie müsste dann der befehl aussehen
                    könnte max. raten das was mit and ...

                    schon gefunden
                    Zuletzt geändert von proggilein; 13.06.2004, 14:43.

                    Kommentar

                    Lädt...
                    X