schwieriger SQL select

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

  • schwieriger SQL select

    Habe folgendes Problem:

    Ich habe ein eigenes Forum geschrieben und möchte in der Übersicht des Boards die Reihenfolge der Threads mit antworten nach Datum sortieren und die Threads ohne Antwort sollen vorher kommen. Folgender Query wurde von mir geschrieben:

    PHP-Code:
    $sql "SELECT tbl1.ID,tbl1.user_ID,tbl1.head,";
    $sql .= "Date_FORMAT(tbl1.posted, '%d.%m.%Y  %H:%i'),MAX(tbl2.posted) as tmp,COUNT(tbl2.ID)";
    $sql .= " FROM forum_thread AS tbl1 LEFT JOIN forum_posts AS tbl2 ON tbl1.ID=tbl2.thread_ID ";
    $sql .= "WHERE tbl1.board_ID='".$board_ID."' OR";
    $sql .= " (tbl1.board_ID='".$board_ID."' AND tbl2.thread_ID IS NULL)";
    $sql .= " GROUP BY tbl1.ID ORDER BY tmp DESC";
    $sql mysql_query($sql);
    while (
    $data mysql_fetch_row($sql)){
        echo 
    "<tr><td>\n";
        echo 
    "<a href=index.php?s=forum_thread&thread_ID=".$data[0]."&board_ID=".$board_ID.">";
        echo 
    $data[2]."</a>";
        echo 
    "</td>\n";
        echo 
    "<td align=center>".get_user($data[1])."<br>".$data[3]."</td>\n";
        echo 
    "<td align=center>".$data[5]."</td>\n";
        
    $sql2 "SELECT user_ID, Date_FORMAT(posted, '%d.%m.%Y  %H:%i') ";
        
    $sql2 .= "FROM forum_posts WHERE thread_ID = ".$data[0]." order by posted desc";
        
    $sql2 mysql_query($sql2);
        list(
    $user,$date) = mysql_fetch_row($sql2);
        echo 
    "<td align=center>";
        echo 
    get_user($user)."</A><br>".$date;
        echo 
    "</td></tr>\n";

    leider steg´hen dann die threads ohne Einträge ganz unten. Liegt wohl daran, dass da NULL drinn steht, oder? Wie bekomme ich das jetzt hin, das es so aussieht wie ich es mir wünsche.

    So ich hoffe ich habe mich halbwegs klar ausgedrückt und mein Thread ist verständlich ^^
    Zuletzt geändert von Burnout; 29.10.2006, 12:30.

  • #2
    umbrüche!
    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
      Entschuldige ich stehe auf dem Schlauch wo soll ich Umbrüche machen??

      Kommentar


      • #4
        http://www.php-resource.de/forum/sho...threadid=50454
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          So ich hoffe ich habe jetzt richtig formatiert

          Kommentar


          • #6
            weis denn keiner was?

            Kommentar


            • #7
              Re: schwieriger SQL select

              ORDER BY
              und dann die Funktion verwenden: http://dev.mysql.com/doc/refman/5.1/...unction_isnull

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                Nach einigem rumprobieren muss ich leider sagen: ich weis nicht wie ich das einbauen soll würdest du mir das genauer erklären?

                Kommentar


                • #9
                  Re: schwieriger SQL select

                  So dachte ich
                  Code:
                  SELECT tbl1.ID, tbl1.user_ID, tbl1.head, Date_FORMAT(tbl1.posted, '%d.%m.%Y  %H:%i'),
                  MAX(tbl2.posted) as tmp, COUNT(tbl2.ID)
                  FROM forum_thread AS tbl1 LEFT JOIN forum_posts AS tbl2 ON tbl1.ID=tbl2.thread_ID
                  WHERE tbl1.board_ID=2 OR (tbl1.board_ID=2 AND tbl2.thread_ID IS NULL)
                  GROUP BY tbl1.ID
                  ORDER BY ISNULL(tmp) DESC, tmp DESC
                  btw. du weißt, dass die Bedingung hinter OR keinen Sinn hat? Du grenzt einmal mit board_ID=X ein und dann nochmal mit board_ID=X, was nach der letzten Bedingung auf jeden Fall true ist. Wenn es das nicht ist, wird durch das AND gar nicht zur thread_ID IS NULL-Bedingung gegangen, d.h. alles ab OR bis zum Ende der Klammer ist vollkommen sinnfrei

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    Re: Re: schwieriger SQL select

                    Original geschrieben von ghostgambler
                    Du grenzt einmal mit board_ID=X ein und dann nochmal mit board_ID=X, was nach der letzten Bedingung auf jeden Fall true ist. Wenn es das nicht ist, wird durch das AND gar nicht zur thread_ID IS NULL-Bedingung gegangen, d.h. alles ab OR bis zum Ende der Klammer ist vollkommen sinnfrei [/B]
                    Nun ja. Es ist doch eigentlich so:

                    Da steht "or" also:
                    entweder board_ID=X oder der IS NULL fall.
                    Damit findet man aber in jedem angezeigten board den thread eben weil da "oder" steht.

                    Deshalb muss ich in der klammer (also "entweder" board_ID=X "oder" klammer) nochmal die board_ID fragen,
                    weil sonst da steht "entweder" board_ID "oder" ISNULL und das ist ja nicht das was selektiert werden soll.

                    Ich kann mich natürlich irren.


                    Dein Tip:
                    Code:
                    ORDER BY ISNULL(tmp) DESC, tmp DESC
                    gibt folgenden Fehler aus:
                    Unknown column 'tmp' in 'order clause'
                    Zuletzt geändert von Burnout; 30.10.2006, 18:51.

                    Kommentar


                    • #11
                      Re: Re: Re: schwieriger SQL select

                      Original geschrieben von Burnout
                      Da steht "or" also:
                      entweder board_ID=X oder der IS NULL fall.
                      Entweder steht da schon mal gar nicht, das wäre nämlich XOR

                      Damit findet man aber in jedem angezeigten board den thread eben weil da "oder" steht.
                      Bitte?

                      a <-> board_ID=X
                      b <-> IS NULL
                      + = OR
                      x = AND
                      Du hast
                      a + (a x b)
                      Daraus lässt sich per Distributiv-Gesetz folgendes bilden
                      a x (1 + b)
                      d.h.
                      a UND (true ODER b)
                      Wann soll also bitte b mal nach seiner Meinung gefragt werden?

                      Dein Tip:
                      Code:
                      ORDER BY ISNULL(tmp) DESC, tmp DESC
                      gibt folgenden Fehler aus:
                      Unknown column 'tmp' in 'order clause'
                      Gib mal bitte einen Test-Dump

                      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                      Wie man Fragen richtig stellt

                      Kommentar


                      • #12
                        Also zu dem WHERE Problem:

                        Vorweg: anders ging es bisher nicht, ich hatte es erst so
                        wie du sagtest

                        ich habe eine Tabelle mit mehreren boards deshalb die
                        board_ID im where soweit sind wir uns einig ^^

                        wenn ich jetzt AND tbl2.thread_ID IS NULL
                        dazugebe dann kommen nur welche die
                        bisher keine antworten erhalten haben
                        da ja keine thread_ID gefunden werden soll

                        wenn ich stattdessen OR tbl2.thread_ID IS NULL
                        finde ich auch bei einem anderen board den thread
                        weil ja auch ohne board_ID ein thread ohne Antworten
                        gefunden werden kann.

                        Also muss ich eine Klammer machen und diesem statement
                        die board_ID nochmal anfügen.

                        dump hängt an allerdings ohne user tabelle

                        user_ID bezieht sich auf diese tabelle ebenso moderator
                        aber das hast du bestimmt auch so mitbekommen
                        Angehängte Dateien

                        Kommentar


                        • #13
                          Hallo Burnout

                          zuerst einmal- Ghostgambler hat recht, dass das OR (tbl1.board_ID=2 AND tbl2.thread_ID IS NULL)
                          überflüssig ist.

                          dann- sollte ORDER BY ISNULL(tmp) DESC gehen, wenn ORDER BY tmp DESC funktioniert hat.

                          Als Alternative kannst du irgendein Feld von tbl2 zum sortieren verwenden, z.B.
                          ORDER BY ISNULL(tbl2.thread_ID) DESC, tmp DESC

                          An der Funktion ISNULL() sollte es nicht liegen, das Sortieren nach expressions ist standard.

                          Viel Glück.

                          Kommentar


                          • #14
                            Jetzt funktioniert alles vielen dank für die Hilfe!

                            Kommentar


                            • #15
                              wie sieht diese query jetzt aus?

                              Kommentar

                              Lädt...
                              X