GROUP BY effizenter bzw. richtiger

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

  • GROUP BY effizenter bzw. richtiger

    N'abend..


    Mal wieder sitze ich vor einem kleinen Problem.
    Ich möchte aus einer Tabelle, in der mehrmals der selbe Name vorkommt, herauslesen, welcher Name mit welchem Inhalt wie oft vorkommt.

    Die Tabelle schaut folgendermassen aus (gekürzt): id, ca, pe
    In der Zeile 'ca' werden die Namen gespeichert und in der Zeile 'pe' die Zyklen in denen der Name gebraucht wurde.
    Ziel ist es nun, eine Liste zu bekommen die mir jeweils einmal den Namen anzeigt und dahinter jeden Zyklus der zum dazugehörigen Namen zu finden ist.
    Als Beispiel:
    Name | Zyklus
    a | 07/07
    a | 08/07
    b | 08/07
    a | 09/07
    c | 09/07
    b | 09|07

    Gewünschtes Ergebnis wäre dann folgendes:

    a: 07/07, 08/07, 09/07
    b: 08/07, 09/07
    c: 09/07

    Erster Gedanke beim basteln dafür war ein GROUP BY welcher folgendermassen aussah:
    PHP-Code:
    SELECT cape FROM bla GROUP BY ca ORDER BY ca 
    Ergebnis nachdem ich das in pma ausführte war, dass ich zwar jedes 'ca' nur einmal erhielt, aber anbei stand jeweils nur eins der 'pe' anstatt alle.

    Was mache ich dabei falsch oder liege ich hierbei mit dem GROUP BY gänzlich falsch?


    Gruss und Danke.

  • #2
    Das ist auch ganz klar kein Fall für GROUP BY.

    Such nach Gruppenwechsel und verwende enstprechend ORDER BY.
    Zuletzt geändert von TobiaZ; 29.06.2008, 15:49.

    Kommentar


    • #3
      N'abend,


      ich hab mich nun durch alle 5 Seiten der Forumssuche zu diesem Stichwort gewühlt und nicht wirkliches gefunden, woraus ich auch von alleine schlau genug werde. Aber ich habe mir einfach mal verschiedenste rausgepickt und versucht was draus wird wenn ich sie für meine Zwecke anpasse. Im Endeffekt bin ich bei einem 'passablen' Beispiel gelandet was fast so funktioniert, wie ich es mir vorstelle - aber eben nur fast.

      PHP-Code:
      <?
          $sql = "SELECT channel, periode FROM cmv ORDER BY channel DESC";    
          $result = mysql_query($sql) OR die(mysql_error());    
          if(mysql_num_rows($result)) {
              while($row = mysql_fetch_array($result)) {
                  $neu = $row['channel'];
                  if ($alt != $neu) {
                      echo    "<BR /><b>";
                      echo    $row['channel'];
                      echo    "</b>:";
                      echo    "".$row['periode'].", ";
                      $alt = $neu;


                  }
                  else {
                      echo    $row['periode'];
                      echo    "<br>";
                  }
              }    
              ?><p>
      <?php
          
      }
          else {
          echo 
      "<b>Keine Einträge vorhanden</b>\n";
          }
      Auflistung schaut nun so aus:

      Channel A: 1, 3
      5
      7
      9
      Channel B: 3,
      Channel C: 3, 5
      Channel D: 3, 5
      7
      9

      usw..

      Gefragt ist also eine Auflistung von 'channel' mit allen dazugehörigen 'periode' daneben. Der Hacken nun aber ist, dass ich max. 2 'periode' danaben angezeigt bekomme und dann gehts ''drunter'' weiter anstatt neben den vorangegangenen. Wo liegt hier der Fehler, habe sowas selbst noch nie gemacht und steh' grad tierisch aufm Schlauch.

      btw. Vorhanden sind alle gewünschten Ausgaben aber am falschen Ort!

      Kommentar


      • #4
        Weil du nach jeder Periode ohne Gruppenbruch einen Zeilenwechsel eingibst (etwa Zeile 18). Ausserdem Kannst du das echo $row['periode'] aus dem if-Teil rausnehmen und dabei den else-Teil sparen.
        Hier noch ein etwas anderes Beispiel (deines ist sonst aber schon ok):
        PHP-Code:
        <?
            $alt = '';            // Initialisierungen
            $sql = "SELECT 
                        channel, 
                        periode 
                    FROM 
                        cmv 
                    ORDER BY 
                        channel DESC";    
            $result = mysql_query($sql) OR die(mysql_error());    
            if(mysql_num_rows($result)) {
                while($row = mysql_fetch_assoc($result)) {
                    $neu = $row['channel'];
                    if ($alt != $neu) {        // Gruppenwechsel ?
                        if($alt != ''){     //Nicht beim ersten Durchgang
                            printf("<b>%s</b>: %s<br />", $alt, implode(', ', $per));  // Daten ausgeben
                        }
                        $per = array();        // Array leeren
                        $alt = $neu;        // Gruppe wechseln
                    }
                    $per[] = $row['periode'];    // Daten zwischenspeichern
                } 
                printf("<b>%s</b>: %s<br />", $alt, implode(', ', $per)); // Letzte Zeile ausgeben
            }
            else {
                echo "<b>Keine Einträge vorhanden</b>\n";
            }
        ?>
        Zuletzt geändert von H2O; 28.11.2007, 10:44.
        Gruss
        H2O

        Kommentar


        • #5
          Wunderbarsten Dank!

          Nun bin ich mal wieder und einen Tick schlauer.

          Kommentar


          • #6
            Mit GROUP_CONCAT wär's einfacher gewesen ...
            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


            • #7
              Original geschrieben von goth
              OffTopic:
              du lebst auch noch?

              gruß
              peter
              Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
              Meine Seite

              Kommentar


              • #8
                Original geschrieben von Kropff
                OffTopic:
                du lebst auch noch?

                gruß
                peter
                Wie man's nimmt ...
                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