Ich möchte Daten aus mehreren Tabellen in einer einzigen Abfrage abrufen und zuerst alle Daten aus einer Tabelle anzeigen, indem ich eine Überschrift des zugehörigen Tabellennamens und die Fußzeilensumme der Punktzahl für jede Tabelle gebe. Wie ich in meinem Code versucht habe, funktioniert es gut, aber ich möchte, dass es in einer einzigen Abfrage funktioniert.

Wie kann ich dies in einer einzelnen Abfrage tun und zuerst eine Tabellendaten mit Tabellennamenkopf und Punktzahl in der Fußzeile abrufen? Und so weiter für jede Sportart.

?php
if (isset($_POST['submit']))
{
$startDate = $_POST['fromDate'];
$date = DateTime::createFromFormat('m/d/Y', $startDate);
$start_date = $date->format("Y-m-d");

$endDate = $_POST['toDate'];
$format = DateTime::createFromFormat('m/d/Y', $endDate);
$end_date = $format->format("Y-m-d");

$query = $db->prepare("SELECT DATE(dateby) AS date, score FROM cricket_table WHERE dateby BETWEEN :st_date  AND :en_date ");
$query->bindParam(':st_date', $start_date);
$query->bindParam(':en_date', $end_date);
$query->execute();

if ($query->rowCount() > 0)
    {

    echo '<label>Cricket</label>
          <table>
          <tbody>';
    $total = 0;
    while ($row = $query->fetch(PDO::FETCH_ASSOC))
        {
?>
                            <tr>
                                <td><?php echo $row['date']; ?></td>
                                <td><?php echo $row['score']; ?></td>
                            </tr>   

<?php
        $total += $row['score'];
        }
?>      
                      </tbody>  
                         <tfoot align="right">
                            <tr><th></th><th></th><th><?php echo $total; ?></th></tr>
                        </tfoot>
                  </table>

<?php
 }
$query1 = $db->prepare("SELECT DATE(dateby) AS date, score FROM football-table WHERE dateby BETWEEN :str_date  AND :ending_date ");
$query1->bindParam(':str_date', $start_date);
$query1->bindParam(':ending_date', $end_date);
$query1->execute();

if ($query->rowCount() > 0)
    {

    echo '<label>Football</label>
          <table>
          <tbody>';
    $total1 = 0;
    while ($row1 = $query1->fetch(PDO::FETCH_ASSOC))
        {
?>
                            <tr>
                                <td><?php echo $row1['date']; ?></td>
                                <td><?php echo $row1['score']; ?></td>
                            </tr>   

<?php
        $total1 += $row1['score'];
        }
?>      
                      </tbody>  
                         <tfoot align="right">
                            <tr><th></th><th></th><th><?php echo $total1; ?></th></tr>
                        </tfoot>
                  </table>
    <?php
    }
} ?>

Aktualisieren

Es funktioniert jetzt mit einer Abfrage und einer HTML-Tabelle. Aber jetzt ist das Problem total, es wird nicht für jede Tabelle die richtige Summe erhalten, sollte für jede Sportart eine Summe sein.

$query = $db->prepare("SELECT 'cricket' sport
 , DATE(dateby) date
 , score 
  FROM cricket_table 
  WHERE dateby BETWEEN :st_date  AND :en_date
UNION ALL
SELECT 'football'
 , DATE(dateby) date
 , score 
  FROM football_table 
 WHERE dateby BETWEEN :str_date  AND :ending_date");
$query->bindparam(':str_date', $str_date);
$query->bindparam(':ending_date', $ending_date);
$query->execute; 
$total=0;
                $norepeat = null;
                while($row = $query->fetch(PDO:: FETCH_ASSOC) ) {
                      $sport = $row['sport'];
                      $date = $row['dates'];
                      $score = $row['score'];
                      $total += $score;

                     if ($norepeat != $sport) {  
                        echo"<h1> $sport </h1>";
                          $norepeat = $sport;
                      }
            echo '<table">
                      <tbody>
                          <tr>
                            <td>'.$date.'</td>
                            <td>'.$score.'</td>
                           </tr>
                     </tbody>  
                     <tfoot align="right">
                        <tr><th></th><th></th><th>'.$total.'</th></tr>
                     </tfoot>
                </table>';
                 }
1
Eniol 23 Feb. 2020 im 10:13

3 Antworten

Beste Antwort

Aus meiner Sicht ist Ihr Code in Ordnung, aber wenn Sie es immer noch in einer einzelnen Abfrage tun möchten, können Sie es erreichen, indem Sie eine Logik in PHP verwenden.

Hier ist die Anfrage von @Strawberry.

SELECT 'cricket' sport
     , DATE(dateby) date
     , score 
  FROM cricket_table 
 WHERE dateby BETWEEN :st_date  AND :en_date
 UNION ALL
SELECT 'football'
     , DATE(dateby) date
     , score 
  FROM football_table 
 WHERE dateby BETWEEN :str_date  AND :ending_date 

Und hier ist PHP-Code:

if ($query->rowCount() > 0)
    {
        $isNewSport=""; //check if is new entry exits
        $total=0; //for sum to score. you can also total score by using a subquery in sql
        while ($row = $query->fetch(PDO::FETCH_ASSOC))
        {
            if($row['sport']==$isNewSport){ //check if this is old sport/record
                echo '<tr>
                        <td>'.$row['date'].'</td>
                        <td>'.$row['score'].'</td>
                     </tr>'
                ?>
                <?php
                $total+=$row['score']; //addition to score row by row
            }
            if($row['sport']!=$isNewSport){ //check if column has new sport/record if so create a new html table or close the last table  
                if($isNewSport!=""){ //if this is new sport so last sport html table should be close
                    echo '</tbody>  
                         <tfoot align="right">
                            <tr><th></th><th></th><th>'.$total.'</th></tr>
                        </tfoot>
                        </table>';
                    $total=0; //and new sum should be zero      
                 }
                 //if this is new sport then new html table should be created.
                echo '<label>'.$row['sport'].'</label>
                      <table>
                      <tbody>
                      <tr>
                        <td>'.$row['date'].'</td>
                        <td>'.$row['score'].'</td>
                       </tr>';
                    $total+=$row['score'];
                    $isNewSport=$row['sport']; //after creating 1st html then set it is as old sport.
            continue;
            }
            echo '</tbody>  
                <tfoot align="right">
                    <tr><th></th><th></th><th>'.$total.'</th></tr>
                </tfoot>
                </table>';
                //at then end close last html table and print total socre
            }
 }

Ich habe es noch nicht überprüft, aber Sie können weitere Tabellen in der Abfrage hinzufügen. Bitte lassen Sie mich wissen, wenn Sie Fragen haben.

0
Mahmood Sanjrani 26 Feb. 2020 im 08:51

Betrachten Sie eine Neugestaltung der Datenbank mit allen gängigen Sportattributen in einer einzigen Tabelle. Dann wäre eine einzelne Abfragelösung viel einfacher. Bei einem Tisch pro Sport würde ich jedoch nicht versuchen, die Aufgabe mit einer einzigen Abfrage zu lösen, es sei denn, ich habe Hinweise auf ein erhebliches Leistungsproblem. Da die Aufgabe für jede Sportart gleich ist und sich nur im Namen unterscheidet, können Sie denselben Code in einer Schleife verwenden.

// set $start_date and $end_date

$sports = [
    'Cricket'  => 'cricket_table',
    'Football' => 'football_table',
    // more sports
];

foreach ($sports as $sportName => $tableName) {
    $query = $db->prepare("
        SELECT DATE(dateby) AS date, score
        FROM `{$tableName}`
        WHERE dateby BETWEEN :st_date  AND :en_date 
    ");
    $query->execute(['st_date' => $start_date, 'en_date' => $end_date]);
    if ($query->rowCount() > 0) {
        echo "<label>{$sportName}</label><table><tbody>";
        $totalScore = 0;
        while ($row = $query->fetchObject()) {
            echo "<tr><td>{$row->date}</td><td>{$row->score}</td></tr>";
            $totalScore += $row->score;
        }
        echo '</tbody><tfoot align="right">';
        echo "<tr><th></th><th>{$totalScore}</th></tr>";
        echo '</tfoot></table>';
}
0
Paul Spiegel 23 Feb. 2020 im 15:54

Hier ist ein Beispiel für eine gültige Abfrage:

SELECT 'cricket' sport
     , DATE(dateby) date
     , score 
  FROM cricket_table 
 WHERE dateby BETWEEN :st_date  AND :en_date
 UNION ALL
SELECT 'football'
     , DATE(dateby) date
     , score 
  FROM football_table 
 WHERE dateby BETWEEN :str_date  AND :ending_date 
0
Strawberry 23 Feb. 2020 im 08:07