Tabellenlayout sinnvoll?

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

  • #16
    Ist auch nicht falsch es so zu lösen. Aber irgendwann kommt man an einen Punkt, wo man die Performance mal gegenüber stellen muss. Gerade bei einem Forum, wo in erster Linie die Lese-Operationen überwiegen. Da darf man gerne beim erstellen der Postings ein-zwei Queries mehr benötigen, wenn es das auslesen beschleunigt.

    Kommentar


    • #17
      Aber ich hab das Gefühl, dass MySQL mir die Abfragen cached.
      Weil beim erstem mal dauerts ca. 10 mal länger als beim wiederholen der Abfrage.

      Und da in das Forum eher selten geschrieben wird (noch), ist das n ganz nettes Feature für mich
      Tempim.de - Dein kostenloser Bildhoster
      Tipps und Tricks für Webmaster

      Kommentar


      • #18
        Und da in das Forum eher selten geschrieben wird (noch), ist das n ganz nettes Feature für mich
        Wie gesagt, ein Grund mehr in Zukunft gewissen Felder zu "cachen".

        Kommentar


        • #19
          Würdest du die Anzahl der Posts eines Users cachen oder bei jedem Seitenaufruf neu ermitteln?

          Und was ist mit einem Cronjob, der jede Stunde zu jedem User die Anzahl der Beiträge neu berechnet?
          Tempim.de - Dein kostenloser Bildhoster
          Tipps und Tricks für Webmaster

          Kommentar


          • #20
            Neues und wichtigeres Problem ;-)

            Ich hab jetzt festgestellt, dass mir folgende Abfrage je nach Anzahl der Threads, die existieren mehr Datensätze liefert.
            Eigentlich wollte ich nur, dass er mir für jedes Thema (welches der kategorie untergeordnet ist) einen Datensatz zurückliefert.
            Bei 6 Themen wären das also 6 Datensätze.

            Ich bekomme aber 30 Datensätze.
            Es existieren 24 Threads, 6 Themen und 4 Kategorien...

            PHP-Code:
            SELECT 
                kategorien
            .category_id
                
            kategorien.category_order
                
            kategorien.category_name,
                
            themen.thema_id,  
                
            themen.thema_name
                
            threads.thread_name,
                
            userdaten.user_id
                
            userdaten.username,
                
            infos.post_id
                
            infos.poster_id
                
            infos.post_time
                
            infos.thread_id,
                (
                    
            SELECT
                        COUNT
            (*)
                    
            FROM
                        forum_threads 
            AS threads2
                    WHERE
                        threads2
            .thema_id threads.thema_id &&
                        
            threads2.deleted 0
                
            )  AS  themenanzahl,
                (
                    
            SELECT
                        COUNT
            (*)
                    
            FROM
                        forum_post_info 
            AS infos2
                    INNER JOIN
                        forum_threads 
            AS threads3 USING(thread_id)
                    
            WHERE
                        threads3
            .thema_id threads.thema_id &&
                        
            threads3.deleted 0
                
            )  AS  beitragsanzahl
            FROM 
                forum_kategorien 
            AS kategorien
            LEFT JOIN 
                forum_themen 
            AS themen USING(category_id
            LEFT JOIN 
                forum_threads 
            AS threads ON threads.thema_id themen.thema_id && threads.deleted  0
            LEFT JOIN 
                forum_post_info 
            AS infos USING(thread_id)
            LEFT JOIN 
                phpbb_users 
            AS userdaten ON userdaten.user_id infos.poster_id
            ORDER BY 
                kategorien
            .category_order ASC
                
            themen.thema_id ASC
                
            infos.post_time ASC 
            Das erledigt zwar, was ich möchte, ist aber nicht sehr toll gelöst, weil bei 10000 Threads dann zu viel Selectiert werden würde.

            Ich habe schon ein group By themen.thema_id versucht. Das hat bis auf einen kleinen aber feinen Unterschied funktioniert:
            Ich bekomme nichtmehr den neuesten Thread, sondern den ältesten angezeigt.

            Meine Frage an die Profis ;-)
            Wie kann ich trotz des GROUP BY erreichen, dass MySQL mir den neuesten Thread anzeigt?

            Ich komme einfach auf keine Lösung :-(


            MfG
            Seggl-hoch-drei


            EDIT:
            Ich hab hier die gleiche Abfrage wie oben nochmal, diesmal aber ohne die Berechnung der Gesamtanzahl der Threads und Beiträge (übersichtlicher):

            PHP-Code:
            SELECT 
                kategorien
            .category_id
                
            kategorien.category_order
                
            kategorien.category_name,
                
            themen.thema_id,  
                
            themen.thema_name
                
            threads.thread_name,
                
            userdaten.user_id
                
            userdaten.username,
                
            infos.post_id
                
            infos.poster_id
                
            infos.post_time
                
            infos.thread_id   
            FROM 
                forum_kategorien 
            AS kategorien
            LEFT JOIN 
                forum_themen 
            AS themen USING(category_id
            LEFT JOIN 
                forum_threads 
            AS threads ON threads.thema_id themen.thema_id && threads.deleted  0
            LEFT JOIN 
                forum_post_info 
            AS infos USING(thread_id)
            LEFT JOIN 
                phpbb_users 
            AS userdaten ON userdaten.user_id infos.poster_id
            ORDER BY 
                kategorien
            .category_order ASC
                
            themen.thema_id ASC
                
            infos.post_time ASC 
            Tempim.de - Dein kostenloser Bildhoster
            Tipps und Tricks für Webmaster

            Kommentar


            • #21
              Code:
              ...
              [COLOR=red]INNER[/COLOR] JOIN 
                  forum_threads AS threads USING(thema_id)
              ...
              WHERE
                  threads.deleted  = 0
              ORDER BY
              ...
              Zuletzt geändert von H2O; 29.04.2008, 16:01.
              Gruss
              H2O

              Kommentar


              • #22
                Das geht leider auch nicht, da ich sonst keine Kategorien angezeigt bekomme, die leer sind....

                Irgendwie mit einem Subselect? Könnte das gehen?
                Tempim.de - Dein kostenloser Bildhoster
                Tipps und Tricks für Webmaster

                Kommentar


                • #23
                  Sorry fürs Pushen!
                  Aber das Problem lässt mir keine Ruhe..
                  Tempim.de - Dein kostenloser Bildhoster
                  Tipps und Tricks für Webmaster

                  Kommentar


                  • #24
                    Bin mir jetzt nicht sicher, ob das hier genau weiterhilft, aber nen Freund hatte mal ein ähnliches Problem und ihn auf ich auf dieses Thema verwiesen:

                    ORDER_BY_ignoriert_mit_GROUP_BY

                    Je nach dem, vlt dann eher MIN()..

                    mfg

                    Kommentar


                    • #25
                      Danke erstmal..!

                      Aber das hat auch nicht geklappt.
                      Ich habe es mit deinem Tipp mit MAX() versucht, auch mit MIN().
                      Aber ich erhalte dann nur die neueste Zeit und nicht den neuesten Thread, leider.

                      Weißt du sonst noch, an was es liegen könnte=
                      Tempim.de - Dein kostenloser Bildhoster
                      Tipps und Tricks für Webmaster

                      Kommentar


                      • #26
                        Vielleicht hier mal das SQL-Satement der Themenübersicht.
                        Denn hier klappt die Sache!

                        PHP-Code:
                        SELECT 
                            threads
                        .thread_namethreads.thread_idthreads.thread_fixedthreads.thread_locked
                            ( 
                        SELECT COUNT(*) FROM forum_polls WHERE thread_idthreads.thread_id ) AS thread_vote,
                            
                        themen.thema_name,
                            
                        kategorie.category_idkategorie.category_name,
                            
                        erster_post.poster_id AS first_poster_idfirst_user_name.username AS authorname,
                            
                        letzter_post.poster_id AS last_poster_idlast_user_name.username AS last_poster_name,  letzter_post.post_time AS last_post_time,
                            (
                                
                        SELECT
                                    COUNT
                        (*)
                                
                        FROM
                                    forum_post_info 
                        AS infos2                    
                                WHERE
                                    infos2
                        .thread_id threads.thread_id 
                            
                        ) AS beitragsanzahl
                        FROM  forum_themen 
                        AS themen
                        LEFT JOIN
                        (
                            
                        SELECT 
                                category_id
                        category_name
                            FROM
                                forum_kategorien 
                        ) AS kategorie
                        ON kategorie
                        .category_id themen.category_id    
                        LEFT JOIN forum_threads 
                        AS threads
                            ON threads
                        .thema_id themen.thema_id && threads.deleted 0         /* darf nicht in WHERE-Klausel stehen, weil sonst keine leeren Themen gefunden werden */
                        LEFT JOIN     
                        (
                            
                        SELECT
                                poster_id
                        post_idpost_timethread_id
                            FROM
                                forum_post_info
                            WHERE
                                post_id 
                        = (
                                                
                        SELECT 
                                                    MIN
                        (post_id)
                                                
                        FROM
                                                    forum_post_info 
                        AS p2
                                                WHERE 
                                                    p2
                        .thread_id forum_post_info.thread_id
                                                GROUP BY
                                                    p2
                        .thread_id                                    
                                            
                        )
                        ) AS 
                        erster_post 
                        ON erster_post
                        .thread_id threads.thread_id
                        LEFT JOIN phpbb_users 
                        AS first_user_name
                            ON first_user_name
                        .user_id erster_post.poster_id
                        LEFT JOIN
                        (
                            
                        SELECT
                                poster_id
                        post_idpost_timethread_id
                            FROM
                                forum_post_info
                            WHERE
                                post_id 
                        = (
                                                
                        SELECT 
                                                    MAX
                        (post_id)
                                                
                        FROM
                                                    forum_post_info 
                        AS p3
                                                WHERE 
                                                    p3
                        .thread_id forum_post_info.thread_id
                                                GROUP BY
                                                    p3
                        .thread_id                                    
                                            
                        )
                        ) AS 
                        letzter_post
                        ON  letzter_post
                        .thread_id threads.thread_id
                        LEFT JOIN phpbb_users 
                        AS last_user_name
                            ON last_user_name
                        .user_id letzter_post.poster_id
                        LEFT JOIN forum_post_info 
                        AS info
                            ON info
                        .thread_id threads.thread_id
                        LEFT JOIN phpbb_users 
                        AS userdaten
                            ON info
                        .poster_id userdaten.user_id
                        WHERE themen
                        .thema_id ".$id_thema."
                        GROUP BY threads.thread_id
                        ORDER BY threads
                        .thread_fixed DESClast_post_time DESC

                        Vielleicht noch ein Hinweis:
                        Mein Forum ist so aufgebaut, dass es Kategorien gibt. In diesen Kategorien gibt es verschiedene Themen und in diesen Themen kann man Threads erstellen.

                        Der oben gepostete Code liefert mir die Threads in einem thema.

                        Da habe ich es mit einem Subselect hinbekommen, aber ich habe keine Ahnung, wie ich das auf meine Kategorienübersicht übertragen kann!

                        Seggl hoch drei
                        Tempim.de - Dein kostenloser Bildhoster
                        Tipps und Tricks für Webmaster

                        Kommentar


                        • #27
                          Original geschrieben von Seggl-hoch-drei
                          Der oben gepostete Code liefert mir die Threads in einem thema
                          Boah, da sag ich mal: Heavy Oversized!
                          [FONT="Helvetica"]twitter.com/unset[/FONT]

                          Shitstorm Podcast – Wöchentliches Auskotzen

                          Kommentar


                          • #28
                            Aber er macht, was er soll
                            Tempim.de - Dein kostenloser Bildhoster
                            Tipps und Tricks für Webmaster

                            Kommentar


                            • #29
                              Und wenn du das so in PhpMyAdmin ausführst, wie lange ist die Abfragedauer?
                              [FONT="Helvetica"]twitter.com/unset[/FONT]

                              Shitstorm Podcast – Wöchentliches Auskotzen

                              Kommentar


                              • #30
                                0,002 sekunden
                                Tempim.de - Dein kostenloser Bildhoster
                                Tipps und Tricks für Webmaster

                                Kommentar

                                Lädt...
                                X