Ausgabe aus MySQl gruppieren und in Liste ausgeben?


19.10.2020, 18:57

Geht das vielleicht mit JavaScript besser?

3 Antworten

Da gibt es 2 Möglichkeiten:

  1. Du machst das in deinem PHP-Code, also du interpretierst deine Liste so, dass du bei jedem Element eine Prüfung einbaust, ob sich das Datum geändert hat.
  2. Du machst erst eine Anfrage in der Datenbank, welche Daten es gibt und fragst dann jedes einzeln ab. Das würde zu kleineren Anfragen führen und in einem gut indexierten Fall, die Datenbank weniger lange blockieren. Kürzere Blockade = Die Applikation kann mehr Anfragen bedienen, bei gleicher Hardware.

Einfacher ist 1.

Mein PHP ist arg eingerostet, HTML .. ich bin nicht mehr sicher ob ul oder li Liste oder Listenelement sind .. egal:

$sql = "SELECT * FROM `ha` WHERE `date` >= '$date' ORDER BY `ha`.`date` ASC, `ha`.`fach` ASC";
    lastDate = NULL
    echo '<ul>'; // Liste aller Daten
    firstRun = true;
    foreach ($pdo->query($sql) as $row) {
        currentDate = $row['date']
        if(lastDate != currentDate) {
           if(!firstRun) echo '</ul>'; // Ende Liste des letzten Datumsblocks
           firstrun = false;
           echo '<li>'.$row['date'].'</li>';
           echo '<ul>'; // Liste für diesen Datumsblock
        }
        echo '<li>'.##das Element, das in die Datumsliste soll.'</li>'; 
    }
    echo '</ul>'; // Ende: Liste des letzten Datums
    echo '</ul>'; // Ende: Liste aller Daten

3dDrucker 
Beitragsersteller
 25.10.2020, 21:06

Ich habe es jetzt so gelöst (Es ist nach für CSS was drin...):

date_default_timezone_set("Europe/Berlin");
    $timestamp = time();
    $date = date('Y-m-d', $timestamp);


    $pdo = new PDO('mysql:host=mysql5.caspar-allround.de;dbname=db303468_2', 'db303468_2', 'ikpkpyeK3;');


    $datearray = array();
    $runde = 0;
    $sql = "SELECT COUNT(date),date FROM ha GROUP BY date";
    foreach ($pdo->query($sql)as $row) {
      if ($row['date']>$date) {
        $datearray[$runde] = array($row['COUNT(date)'], $row['date']);
        $runde = $runde + 1;
      }
    }
    echo '<div class="container">
    <div class="calendar light">';
    $facharray = array();
    for ($i=0; $i < count($datearray); $i++) {
      $datearrayjetzt = $datearray[$i][1];
      $daystamp = strtotime($datearrayjetzt);
      $day = date('l', $daystamp);
      echo '<div class="calendar_plan">
      <div class="cl_plan">';
      echo '<div class="cl_title">'.$day.'</div>';
      echo '<div class="cl_copy">'.$datearrayjetzt.'</div></div></div>';
      $sql = "SELECT fach FROM ha WHERE date = '$datearrayjetzt' GROUP BY fach ORDER BY fach";
      $runde = 0;
      $facharray[$i] = array();
      foreach ($pdo->query($sql)as $row) {
        $facharray[$i][$runde] = $row['fach'];
        $runde = $runde + 1;
      }
      echo '<div class="calendar_events">';
      for ($if=0; $if < count($facharray[$i]); $if++) {
        $datearrayjetzt = $datearray[$i][1];
        $facharrayjetzt = $facharray[$i][$if];


        $stmt = $pdo->prepare("SELECT datei FROM ha WHERE date='$datearrayjetzt' AND fach='$facharrayjetzt'");
        $stmt->execute(); 
        $user = $stmt->fetch();
        


        echo '<div class="event_item">
        <div class="ei_Dot';
        if (empty($user[0])) {
          echo ' dot_active';
        } 
        echo '"></div>
        <div class="ei_Title">'.$facharrayjetzt.'</div>';
        $sql = "SELECT aufgabe FROM ha WHERE date = '$datearrayjetzt' AND fach = '$facharrayjetzt'";
        foreach ($pdo->query($sql)as $row) {
          echo '<div class="ei_Copy">'.utf8_encode($row['aufgabe']).'</div>';
        }
        echo '</div>';
      }
      echo '</div>';
    }
    echo '</div>'; 
3dDrucker 
Beitragsersteller
 25.10.2020, 21:07
@3dDrucker

Es arbeitet zwar mit <div>, aber mit ein paar Anpassungen hatte ich auch eine Liste...

Das geht am ehesten innerhalb der while-Schleife indem Du prüfst, ob das Datum des Datensatzes ein anderes Datum als beim vorherigen Datensatz ist.

Woher ich das weiß:Berufserfahrung

3dDrucker 
Beitragsersteller
 18.10.2020, 22:57

Hast du einen Code, weil ich kriege es irgendwie nicht hin?

3dDrucker 
Beitragsersteller
 18.10.2020, 23:02
@threadi

Bisher ist mein Code:

$dateold = '';
    $fachold = '';


    echo '<ul>';
$sql = "SELECT * FROM `ha` WHERE `date` >= '$date' ORDER BY `ha`.`date` ASC, `ha`.`fach` ASC";
    foreach ($pdo->query($sql) as $row) {
        $date1 = 0;
        $fach1 = 0;


        if ($dateold !== $row['date']){
            echo '<li>'.$row['date'];
            $fachold = '';
            $date1 = 1;
        }
        if ($fachold !== $row['fach']){
            echo '<ul><li>'.$row['fach'];
            $fach1 = 1;
        }
        echo '<ul> <li>'.$row['aufgabe'].'</li>';
        if ($fach1 == 1){
            echo '</ul></li></ul>';
        }
        if ($date1 == 1){
            echo '</li>';
        }
        $dateold = $row['date'];
        $fachold = $row['fach'];
        $aufgabeold = $row['aufgabe'];
    }
    echo '</ul>';  
    ?>

Lese dich in die Dynamik zwischen Group By und Heaving ein. Es ist komplex aber wenn du einmal ein grupiertes Ergebnis hast kannst du mit Heaving festlegen nach welchen weiteren Kriterien gruppiert werden soll.

Woher ich das weiß:Berufserfahrung

3dDrucker 
Beitragsersteller
 19.10.2020, 11:24

Das funktioniert aber nur mit COUNT oder MAX, da kann ich mir ja nicht den gruppierten Wert ausgeben lassen oder?

geri3d  19.10.2020, 11:41
@3dDrucker

Leider ist es eine Weile her als ich noch ABC Analysen in SQL programmieren musste.