Fehlerhafte Abfrage bei LEFT JOIN

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

  • Fehlerhafte Abfrage bei LEFT JOIN

    Code:
                     SELECT 
                       c.id AS catid, 
                       f.id AS forumid, f.name AS forumname, f.description, 
                       MAX(r.datum) AS last_reply_date, 
                       t.id AS last_thread_id, t.title AS last_thread_title, 
                       u.username AS last_reply_user
                     FROM forum_cats AS c
                     INNER JOIN forum_forums AS f ON f.cat_id = c.id
                     LEFT JOIN forum_replys AS r ON r.forum_id = f.id
                     LEFT JOIN forum_threads AS t ON t.id = r.thread_id
                     LEFT JOIN users AS u ON u.id = r.user_id 
                     GROUP BY f.id
                     ORDER BY c.id ASC , f.id ASC;
    Also, es stimmt eigentlich alles, bis auf die Ergebnisse bei den Threads.
    Das last_reply_date ist das richtige.
    Die last_thread_id die falsche.
    Der last_thread_title ebenfalls der falsche.

    Demgemäß dürfte das Problem beim zweiten LEFT JOIN liegen.
    Ich denke mal er wählt nicht den Datensatz aus, den ich mit MAX(r.datum) "anspreche".



    Es sollen alle "foren" und die details zu den letzten (vom datum her) Beiträgen darin ausgelesen werden.

    tabellenstruktur:
    Code:
    -- 
    -- Table structure for table `forum_cats`
    -- 
    
    CREATE TABLE forum_cats (
      id int(10) unsigned NOT NULL auto_increment,
      name varchar(100) NOT NULL default '',
      PRIMARY KEY  (id),
      KEY name (name)
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Table structure for table `forum_forums`
    -- 
    
    CREATE TABLE forum_forums (
      id int(10) unsigned NOT NULL auto_increment,
      cat_id int(10) NOT NULL default '0',
      name varchar(100) NOT NULL default '',
      private tinyint(1) NOT NULL default '0',
      description varchar(250) NOT NULL default '',
      PRIMARY KEY  (id),
      KEY cat_id (cat_id,name)
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Table structure for table `forum_replys`
    -- 
    
    CREATE TABLE forum_replys (
      id int(10) unsigned NOT NULL auto_increment,
      thread_id int(10) NOT NULL default '0',
      forum_id int(10) NOT NULL default '0',
      user_id int(10) NOT NULL default '0',
      datum int(20) NOT NULL default '0',
      title varchar(100) NOT NULL default '',
      text text NOT NULL,
      bbcode tinyint(1) NOT NULL default '0',
      PRIMARY KEY  (id),
      KEY thread_id (thread_id,forum_id,user_id),
      FULLTEXT KEY text (text)
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Table structure for table `forum_threads`
    -- 
    
    CREATE TABLE forum_threads (
      id int(10) unsigned NOT NULL auto_increment,
      forum_id int(10) NOT NULL default '0',
      user_id int(10) NOT NULL default '0',
      title varchar(100) NOT NULL default '',
      closed tinyint(1) NOT NULL default '0',
      sticky tinyint(1) NOT NULL default '0',
      PRIMARY KEY  (id),
      KEY forum_id (forum_id,user_id)
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Table structure for table `users`
    -- 
    
    CREATE TABLE users (
      id int(10) unsigned NOT NULL auto_increment,
      username varchar(50) NOT NULL default '',
      ........
    ) TYPE=MyISAM;

  • #2
    ganz einfach ...


    der Thread mit der höchsten Nummer muß ja nicht der Thread sein,
    auf dem zuletzt geantwortet wurde ...

    da mußt du wohl nochmal deine Logik überdenken
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      der thread, in dem der letzte beitrag in diesem forum und gleichzeitig auch diesem thread ist, ist der wo als letztes geantwortet wurde.

      demnach MAX(r.datum).

      oder hab ich dich falsch verstanden?

      Kommentar


      • #4
        TBT: Ich wähle nirgendwo den thread mit der höchsten nummer aus.
        ich wähle den beitrag mit dem höchsten timestamp.
        wie wähle ich den dazugehörigen thread aus?

        Kommentar


        • #5
          warum nimmst du die threadid aus der Tabelle forum_threads?
          und nicht aus der tabelle forum_replys, wo du auch das zugehörige max(datum)
          selectiert hast
          TBT

          Die zwei wichtigsten Regeln für eine berufliche Karriere:
          1. Verrate niemals alles was du weißt!


          PHP 2 AllPatrizier II Browsergame

          Kommentar


          • #6
            weil es keinen unterschied macht.
            habs trotzdem mal geändert.

            jetzt versteh ich auch warum du dachtest ich basiere das auf der höchsten threadid, wegen meines aliases "last_thread_id" nehme ich an.

            ich habe noch ein bisschen mehr ausprobiert.

            Code:
            SELECT MAX( r.datum ) AS last_date, r.thread_id, t.title, t.forum_id AS forumid, u.username
            FROM forum_replys AS r
            JOIN forum_threads AS t ON r.thread_id = t.id
            LEFT JOIN users AS u ON u.id = r.user_id
            GROUP BY t.forum_id
            diese query selektiert:
            - den korrekten (letzten) reply-timestamp eines jeden forums.
            - die falsche threadid und den falschen namen.

            dabei hab ich herausgefunden, dass es jeweils die ersten einträge mit der threadid aus der tabelle forum_replys auswählt.
            zu diesen einträgen selektiert es dann die id und den dazugehörigen titel, der zusammenhang stimmt also.


            ich möchte aber:
            MAX (r.datum), r.thread_id <- die threadid zugehörig zu dem datensatz mit dem maximalwert von datum.


            Noch ein Ansatz (ergibt keine Ergebnisse):
            Code:
            SELECT MAX( r1.datum ) AS last_date, r2.thread_id, r2.datum, t.title, t.forum_id AS forumid, u.username
            FROM forum_replys AS r1, forum_replys AS r2, forum_threads AS t, users AS u
            WHERE r2.thread_id = t.id
            AND u.id = r2.user_id
            GROUP BY t.forum_id
            HAVING r2.datum = last_date
            Zuletzt geändert von rythms; 19.11.2004, 23:56.

            Kommentar

            Lädt...
            X