JOIN möglich?

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

  • JOIN möglich?

    'nabend,

    ich habe zwei tabellen,

    blog (b) für meine blog-einträge mit den spalten bid, bdate, etc.
    und
    comm (c) für die kommentare zu den blog-einträgen, mit den spalten cid, bid, cdate etc.

    (MySQL-Version ist 3.23.57)

    derzeit liste ich in meinem archiv auf, wie viele blogeinträge es pro monat gab, mit COUNT(BID) und GROUP BY YEAR, MONTH kein problem.

    nun würde ich aber gerne auch noch in dieser liste anzeigen, wie viele kommentare insgesamt zu allen blog-einträgen des jeweiligen monats gab.

    allerdings bekomme ich langsam zweifel, ob das mit einem JOIN überhaupt möglich ist.

    beispieldaten:
    Code:
    bid  cid monat jahr
    67   275  10   2004
    67   274  10   2004
    67   273  10   2004
    66   272   9   2004
    66   271   9   2004
    66   269   9   2004
    66   268   9   2004
    66   267   9   2004
    65   266   9   2004
    65   265   9   2004
    65   264   9   2004
    64   270   8   2004
    64   263   8   2004
    64   262   8   2004
    64   261   8   2004
    64   260   8   2004
    um die auflistung/zählung pro monat hinzubekommen, muss ich ja zunächst mal nach jahr und monat gruppieren, um dann per COUNT(b.bid) die anzahl der blogeinträge pro monat zu zählen.

    doch wie bekomme ich jetzt auch noch die anzahl der kommentare zu den beiträgen eines monats heraus?
    (es geht mir nicht um das datum der kommentare, sondern darum, wie viele kommentare insgesamt zu den blogeinträgen des jeweiligen monats vorliegen, egal wann die kommentare erstellt wurden. deshalb habe ich das datum aus der comm-tabelle auch gar nicht berücksichtigt.)

    habe so langsam den verdacht, dass ich das nur PHP-seitig lösen kann.
    also nur nach b.bid gruppieren und die jeweiligen kommentare per COUNT(cid) zusammenzählen - das verdichtet mir obigen beispieldatenbestand schon mal zu
    Code:
    bid monat jahr  count(cid)
    67   10   2004   3
    66    9   2004   5
    65    9   2004   3
    64    8   2004   5
    - und dann die anzahl der blogeinträge pro monat und kommentare insgesamt zu den blogeinträgen dieses monats dann in PHP per gruppenwechsel aufsummieren :-/

    ich hätte also gerne am ende raus:
    Code:
    10.2004   blogeinträge: 1   kommentare: 3
     9.2004   blogeinträge: 2   kommentare: 8
     8.2004   blogeinträge: 1   kommentare: 5
    oder hat jemand noch eine andere idee für mich?
    Zuletzt geändert von wahsaga; 16.11.2004, 20:51.
    I don't believe in rebirth. Actually, I never did in my whole lives.

  • #2
    Code:
    SELECT
      CONCAT(MONTH(b.bdate), '-', YEAR(b.bdate)) 'Monat',
      COUNT(DISTINCT b.bid) 'Blog-Einträge',
      SUM(IF(ISNULL(c.cid), 0, 1)) 'mit Kommentaren'
    FROM
      blog b
      LEFT JOIN comm c ON b.bid = c.bid
    GROUP BY
      CONCAT(MONTH(b.bdate), '-', YEAR(b.bdate))
    gibt mir bei diesen Werten
    Code:
    CREATE TABLE `blog` (
      `bid` int(10) NOT NULL auto_increment,
      `bdate` datetime NOT NULL default '0000-00-00 00:00:00',
      `bentry` varchar(255) NOT NULL default '',
      PRIMARY KEY  (`bid`)
    ) TYPE=MyISAM;
    
    INSERT INTO `blog` (`bid`, `bdate`, `bentry`) VALUES 
    (1, '2004-03-15 00:00:00', 'Eintrag 1'),
    (2, '2004-03-17 00:00:00', 'Eintrag 2'),
    (3, '2004-04-15 00:00:00', 'Eintrag 3'),
    (4, '2004-05-07 00:00:00', 'Eintrag 4'),
    (5, '2004-05-09 00:00:00', 'Eintrag 5'),
    (6, '2004-05-17 00:00:00', 'Eintrag 6'),
    (7, '2004-02-15 00:00:00', 'Eintrag 7');
    
    
    DROP TABLE IF EXISTS `comm`;
    CREATE TABLE `comm` (
      `cid` int(10) NOT NULL auto_increment,
      `bid` int(10) NOT NULL default '0',
      `ccomment` varchar(250) NOT NULL default '',
      `ctime` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`cid`)
    ) TYPE=MyISAM;
    
    INSERT INTO `comm` (`cid`, `bid`, `ccomment`, `ctime`) VALUES 
    (1, 1, 'Kommentar 1', '2004-05-07 00:00:00'),
    (2, 1, 'Kommentar 2', '2004-08-07 00:00:00'),
    (3, 1, 'Kommentar 3', '2004-06-07 00:00:00'),
    (4, 5, 'Kommentar 4', '2004-05-09 00:00:00'),
    (5, 3, 'Kommentar 5', '2004-05-07 00:00:00'),
    (6, 5, 'Kommentar 6', '2004-11-13 00:00:00');
    das hier aus:
    Code:
     Monat   Blog-Einträge   mit Kommentaren
    2-2004               1                 0
    3-2004               2                 3
    4-2004               1                 1
    5-2004               3                 2
    Passt das?
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      jepp, das scheint zu funktionieren.

      hm, irgendwie was mit SUM und IF zu machen hatte ich auch schon überlegt, nur kam ich nicht ganz auf den richtigen weg.

      und monat und jahr per CONCAT zu verknüpfen ist auch nicht nötig, funktioniert mit GROUP BY jahr, monat ebenfalls - und so kann ich's besser brauchen, weil ich ja eh die monatsnummer und das jahr einzeln brauche für die ausgabe.

      danke, happi :-)
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        i live to please (manchmal) :-)
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          Ich weiss es ist spät ... und sicher überseh' ich was aber wo ist der Unterschied im Ergebnis bei einem einfachen:
          Code:
          SELECT
               CONCAT(MONTH(b.bdate), '-', YEAR(b.bdate)) 'Monat',
               COUNT(DISTINCT b.bid) 'Blog-Einträge',
               COUNT(DISTINCT c.cid) 'mit Kommentaren'
            FROM blog b
            LEFT JOIN comm c
              ON b.bid = c.bid
           GROUP BY CONCAT(MONTH(b.bdate), '-', YEAR(b.bdate))
          ???
          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


          • #6
            du schummelst ja, zweimal DISTINCT gilt nicht

            aber hast natürlich recht, ist vom ergebnis her genau das gleiche
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              danke auch an dich, goth.

              mir war wohl irgendwie noch nicht so ganz klar, wie DISTINCT sich in so einem falle auswirkt ...
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Original geschrieben von mrhappiness
                du schummelst ja, zweimal DISTINCT gilt nicht

                aber hast natürlich recht, ist vom ergebnis her genau das gleiche
                Ich war mir gestern abend wirklich nicht ganz sicher ... etwas wenig Schlaf die letzten Wochen ...
                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

                Lädt...
                X