[MySQL 3.23.X] GROUP BY im JOIN

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

  • [MySQL 3.23.X] GROUP BY im JOIN

    Hallo,

    irgend wie hab ich grad ne Denkblockade

    Bei folgender Abfrage wird mir nur der erste Datensatz ausgegeben anstatt alle:
    SELECT lsu.id_link_stat_url, lsu.name, lsu.url, COUNT( lss.id_link_stat_url ) AS num
    FROM link_stat_url lsu
    LEFT JOIN link_stat_statistik lss
    USING ( id_link_stat_url )
    WHERE lsu.id_link_stat_projekte =1
    GROUP BY lss.id_link_stat_url
    ORDER BY lsu.name
    LIMIT 0 , 30

    Ausgabe:

    id_link_stat_url name url num
    1 domain1.de http://www.domain1.de 0


    Dump:

    CREATE TABLE `link_stat_url` (
    `id_link_stat_url` int(10) unsigned NOT NULL auto_increment,
    `id_link_stat_projekte` int(10) unsigned NOT NULL default '0',
    `url` varchar(255) NOT NULL default '',
    `name` varchar(255) NOT NULL default '',
    `datum` int(10) unsigned NOT NULL default '0',
    PRIMARY KEY (`id_link_stat_url`)
    ) TYPE=MyISAM AUTO_INCREMENT=3 ;

    #
    # Daten für Tabelle `link_stat_url`
    #

    INSERT INTO `link_stat_url` VALUES (1, 1, 'http://www.domain1.de', 'domain1.de', 1086094704);
    INSERT INTO `link_stat_url` VALUES (2, 1, 'http://www.domain2.de', 'domain2.de', 1086095674);



    CREATE TABLE `link_stat_statistik` (
    `id_link_stat_statistik` int(10) unsigned NOT NULL auto_increment,
    `id_link_stat_url` int(10) unsigned NOT NULL default '0',
    `datum` int(10) unsigned NOT NULL default '0',
    PRIMARY KEY (`id_link_stat_statistik`)
    ) TYPE=MyISAM AUTO_INCREMENT=1 ;



    Irgend wie hängt das mit dem GROUP BY zusammen. Wenn ich das entferne werden mir nämlich beide (alle) Datensätze angezeigt. Versteh nur nicht warum.
    Grüsse,
    Sebastian


    Profil Flex Freelancer
    Twitter twitter.com/flashhilfe
    Web Flash und Flex Community

  • #2
    Dein GROUP BY is mal völlig falsch
    Man gruppiert grundsätzlich imme rnach allen single cols der abfrage. Auch wenn MySQL alles zulässt ist es nicht richtig.
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      Danke für Deine Antwort.

      Kennst du eine andere Lösung? - oder muß ich mit zwei Querys arbeiten?
      Grüsse,
      Sebastian


      Profil Flex Freelancer
      Twitter twitter.com/flashhilfe
      Web Flash und Flex Community

      Kommentar


      • #4
        Hm, dann also mit zwei Querys
        Grüsse,
        Sebastian


        Profil Flex Freelancer
        Twitter twitter.com/flashhilfe
        Web Flash und Flex Community

        Kommentar


        • #5
          Original geschrieben von Sebastian W
          Irgend wie hängt das mit dem GROUP BY zusammen. Wenn ich das entferne werden mir nämlich beide (alle) Datensätze angezeigt. Versteh nur nicht warum.
          Original geschrieben von Sebastian W
          Hm, dann also mit zwei Querys


          Was willst Du eigentlich machen ???
          Irgendwie fehlt dem thread hier die Frage...

          Kommentar


          • #6
            "Bei folgender Abfrage wird mir nur der erste Datensatz ausgegeben anstatt alle" ..... ok, da fehlt noch das: -> Warum?
            Dann ist das auch ne Frage

            Was ich möchte wird klar wen man sich das erste Query ansieht.

            ... alle Datensätze aus der Tabelle link_stat_url ausgeben und dazu die Einträge aus link_stat_statistik zu dem entsprechenden Beitrag zusammen zählen.
            Grüsse,
            Sebastian


            Profil Flex Freelancer
            Twitter twitter.com/flashhilfe
            Web Flash und Flex Community

            Kommentar


            • #7
              OK, also es funktioniert und Du weisst nicht warum...
              dann schau' bitte die post von MelloPie an damit das
              nicht nur zufällig funktioniert

              Ein GROUP BY "gruppiert" gleiche Zeilen.
              Genauer gesagt zuerst wird danach sortiert und bei jedem Unterschied
              eine Zeile ausgegeben. Dazwischen lassen sich sog. Aggregatfunktionen
              wie COUNT schalten.
              Z.B.

              A B
              1 1
              1 2
              1 2
              2 2

              GROUP BY A,B:
              1 1
              1 2 hier COUNT(*)=2
              2 2

              Dein USING ist nicht üblich, normalerweise verwendet man
              LEFT JOIN ... ON

              Kommentar


              • #8
                >> Dein USING ist nicht üblich, normalerweise verwendet man
                LEFT JOIN ... ON

                Nein das stimmt nicht. ON benutz man wenn die Spalten in den Tabellen unterschiedlich benannt wurden.

                >> OK, also es funktioniert und Du weisst nicht warum...
                Nein, es funktioniert nicht.

                Also noch mal, link_stat_url:
                Die URL und die IDs sind eindeutig und sollen angezeigt werden.
                Aus der Tabelle link_stat_statistik sollen alle Einträge zu den URL gezählt werden. Es kann auch sein das noch kein Eintrag in der link_stat_statistik zu einer URL vorhanden ist.

                Das ist eigentlich alles was ich möchte.

                Das GROUP BY soll alle IDs aus der Tabelle link_stat_statistik zusammen führen (wie DISTINCT nur das ich wissen möchte wieviele Einträge in der Tabelle für die jeweilige ID sind). Das COUNT soll also die Einträge aus der Tabelle link_stat_statistik zusammen zählen und nicht aus link_stat_url


                Wie auch immer, jetzt hab ich die Lösung gefunden:

                SELECT lsu.id_link_stat_url, lsu.name, lsu.url, COUNT( lss.id_link_stat_url ) AS num
                FROM link_stat_url lsu
                LEFT JOIN link_stat_statistik lss
                USING ( id_link_stat_url )
                WHERE lsu.id_link_stat_projekte =1
                GROUP BY id_link_stat_url # nicht lss.id_link_stat_url
                ORDER BY lsu.name
                Grüsse,
                Sebastian


                Profil Flex Freelancer
                Twitter twitter.com/flashhilfe
                Web Flash und Flex Community

                Kommentar


                • #9
                  Da hast Du aber Glück gehabt

                  Falls Dich Dein Glück verlässt: Nimm den hier.

                  SELECT lsu.id_link_stat_url, lsu.name, lsu.url, COUNT( * ) AS num
                  FROM link_stat_url lsu
                  LEFT JOIN link_stat_statistik lss ON lsu.id_link_stat_url = lss.id_link_stat_url
                  WHERE lsu.id_link_stat_projekte =1
                  GROUP BY lsu.id_link_stat_url, lsu.name, lsu.url
                  ORDER BY lsu.name

                  Kommentar


                  • #10
                    Glück sollte man beim Programmieren nicht haben... hehe
                    Aber hast schon recht, ist nen wenig zusammen gewürfelt.

                    Danke für den Hinweis.

                    Noch ne Kleinigkeit (USING):

                    SELECT lsu.id_link_stat_url, lsu.name, lsu.url, COUNT( * ) AS num
                    FROM link_stat_url lsu
                    LEFT JOIN link_stat_statistik lss
                    USING(id_link_stat_url)
                    WHERE lsu.id_link_stat_projekte =1
                    GROUP BY lsu.id_link_stat_url, lsu.name, lsu.url
                    ORDER BY lsu.name

                    und ich bin glücklich )

                    Ist den mein Query eigentlich falsch? Wenn ja, warum? - mit GROUP BY muß ich mich wohl noch mal näher beschäftigen
                    Grüsse,
                    Sebastian


                    Profil Flex Freelancer
                    Twitter twitter.com/flashhilfe
                    Web Flash und Flex Community

                    Kommentar


                    • #11
                      Hallo!
                      Es klappt weil die Situation bei Dir einzigartig ist:

                      1. Du verwendest für den GROUP BY eine unique Spalte
                      2. Der Join geht genau auf die Spalte
                      3. Es kommen wohl nur unterschiedliche lss.id_link_stat_url pro id_link_stat_url vor (sonst stimmt der COUNT nicht)

                      Weil das alles wohl zutrifft, funktioniert Dein Query.
                      Und weil Du Dir das wohl nicht überlegt hast bist Du ein Glückspilz!

                      Aber: Falls Du die Zugriffe nicht pro id_link_stat_url sondern z.B. pro
                      lsu.url haben willst musst Du id_link_stat_url aus dem Select nehmen,
                      und dann geheh die Probleme richtig los!


                      Der Server sortiert dann wie oben beschrieben pro id_link_stat_url
                      und wirft bei jeder Änderung ein Datensatz 'raus, je nach dem wie die
                      Daten in der DB stehen die lsu.url doppelt und dreifach.

                      Wenn man alle "einfachen" Spalten die man braucht in den GROUP BY schreibt kann nichts passieren.

                      Übrigends: Auf anderen SQL-Servern (nicht MySQL) gibt so etwas eine Fehlermeldung,
                      bei MySQL eine Warnung in der Doku.

                      Kommentar


                      • #12
                        Ok, wieder was gelernt. Vielen Dank.
                        Grüsse,
                        Sebastian


                        Profil Flex Freelancer
                        Twitter twitter.com/flashhilfe
                        Web Flash und Flex Community

                        Kommentar

                        Lädt...
                        X