news und comments

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

  • news und comments

    hallo,

    also ich hab eine tabelle news und eine namens comments ..
    sinn und zweck sollte glaub ich klar sein

    "SELECT `news`.*, count(`comments`.`news`) as `comments` FROM `news`, `comments` WHERE `comments`.`news` = `news`.`id` GROUP BY `comments`.`id` ORDER BY `timestamp` DESC LIMIT 0, 10"

    dabei hab ich das problem dass er mir die news nur zurückliefert wenn mindestens 1 kommentar vorhanden ist .. warum ? .. und wie kann ich das umgehen ?

    danke schonmal
    mfg,
    [color=#0080c0]Coragon[/color]

  • #2
    das kommt durch den join, mach mal nen left join

    SELECT
    `news`.*,
    count(`comments`.`news`) as `comments`
    FROM `news`
    LEFT JOIN comments ON (`comments`.`news` = `news`.`id`)
    GROUP BY `comments`.`id`
    ORDER BY `timestamp`
    DESC LIMIT 0, 10

    (alle aus news + die aus comments, wo welche da sind)
    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
      geht leider nicht ganz .. dh die erste zeile zeigt er an .. die 2te nicht mehr, erst wenn ich für die 2te ein kommentar hab ..

      Code:
      SELECT `news`.`id` , `news`. `text` , `news`.`views` , `news`.`author` , `news`.`ip` , `news`.`host` , `news`.`timestamp` , count( `comments`.`news` ) AS `comments` 
      FROM `news`
      LEFT JOIN `news_comments`AS `comments` ON ( `comments`.`news` = `news`.`id` ) 
      GROUP BY `comments`.`id`
      ORDER BY `news`.`timestamp` DESC LIMIT 0, 5
      so sieht die abfrage jetzt aus .. funktioniert leider nicht ..

      Code:
      CREATE TABLE `news` (
        `id` int(11) NOT NULL auto_increment,
        `text` text,
        `views` int(11) NOT NULL default '0',
        `author` int(11) NOT NULL default '0',
        `ip` varchar(15) NOT NULL default '',
        `host` varchar(100) NOT NULL default '',
        `timestamp` int(11) NOT NULL default '0',
        PRIMARY KEY  (`id`)
      ) TYPE=MyISAM;
      
      INSERT INTO `news` VALUES (1, 'test', 0, 1, '127.0.0.1', 'LOCALHOST', 1037622502);
      INSERT INTO `news` VALUES (2, 'nur test', 0, 1, '127.0.0.1', 'LOCALHOST', 1037623548);
      
      CREATE TABLE `news_comments` (
        `id` int(11) NOT NULL auto_increment,
        `news` int(11) NOT NULL default '0',
        `text` text,
        `author` int(11) NOT NULL default '0',
        `ip` varchar(15) NOT NULL default '',
        `host` varchar(100) NOT NULL default '',
        `timestamp` int(11) NOT NULL default '0',
        PRIMARY KEY  (`id`)
      ) TYPE=MyISAM;
      mfg,
      [color=#0080c0]Coragon[/color]

      Kommentar


      • #4
        das liegt wohl daran dass Du nach comments.id gruppierst.
        wenn nun comments.id = null ist, bekommst Du den ersten Wert aus der referenztabelle sonst nichts.
        Zuletzt geändert von MelloPie; 18.11.2002, 17:28.
        Beantworte nie Threads mit mehr als 15 followups...
        Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

        Kommentar


        • #5
          hm, stimmt ..

          wenn ich nach news.id gruppiere gehts ..
          wobei ichs mir derweil noch nicht erklären kann

          naja, herzliches danke an euch =)
          mfg,
          [color=#0080c0]Coragon[/color]

          Kommentar


          • #6
            Is doch klar:
            Es kann vorkommen, dass comments.id keinen Wert enthält, d.h. = null ist.
            Wenn Du dann nach comments.id gruppierst, gruppierst Du auch alle null Felder zusammen und erhältst die erste Zeile die dazu passt ausgegeben.
            Wenn Du nach News.ID gruppierst kannst Du aufgrund Deiner join Verbindung sicher sein, dass news.id nicht null ist.
            Beantworte nie Threads mit mehr als 15 followups...
            Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

            Kommentar


            • #7
              kurz zusammengefasst, so müsste es gehen:

              select a.*,count(b.news) as anzahl from news as a left join comments as b on a.id=b.news group by a.id
              meine Projekte bestaunen: http://www.kleiza.de

              Kommentar


              • #8
                durch die erklärung von mellowpie hab ichs nun geschnallt, danke
                wäre wahrscheinlich durch nachdenken auch drauf gekommen .. aber wies nun mal so ist hat man auch andres am hut ..
                mfg,
                [color=#0080c0]Coragon[/color]

                Kommentar

                Lädt...
                X