Je veux récupérer des données de plusieurs tables dans une seule requête, et afficher toutes les données d'une table en premier en donnant un en-tête du nom de la table associée, et en pied de page la somme des scores pour chaque table. Comme j'ai essayé dans mon code, il fonctionne bien, mais je veux qu'il le fasse en une seule requête.
Comment puis-je faire cela en une seule requête et récupérer d'abord les données d'une table avec l'en-tête du nom de la table et la somme du score au pied de page, Et ainsi de suite pour chaque sport.
$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>';
}
Update
Il fonctionne maintenant avec une requête et une table HTML, mais maintenant le problème est total, ce n'est pas obtenir la somme correcte pour chaque table, devrait être un total pour chaque sport.
?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
}
} ?>
3 Réponses :
Voici un exemple de requête valide:
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
Et comment puis-je remplir toutes les données de tableau dans un tableau HTML différent?
C'est juste une simple boucle. Chaque fois que le «sport» change, vous créez une nouvelle table.
de cette façon, il récupère le nom du sport pour chaque ligne. Mais je veux récupérer 1 nom de sport et le total du score pour chaque table de base de données particulière.
Voir Pourquoi devrais-je fournir un MCRE pour ce qui me semble être une requête SQL très simple et modifier votre question en conséquence.
Envisagez une refonte de la base de données contenant tous les attributs sportifs communs dans une seule table. Une solution de requête unique serait alors beaucoup plus simple. Mais avec une table par sport, je n'essaierais pas de résoudre la tâche avec une seule requête, à moins d'avoir la preuve d'un problème de performance important. Comme la tâche est la même pour chaque sport et ne diffère que par le nom, vous pouvez utiliser le même code en boucle.
// 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>';
}
De mon point de vue, votre code est correct, mais si vous voulez toujours le faire en une seule requête, vous pouvez y parvenir en utilisant une logique en php.
voici la requête de @Strawberry.
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
}
}
et voici le code php:
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
Je n'ai pas ' t l'a encore vérifié mais vous pouvez ajouter plus de tables dans la requête. S'il vous plaît laissez-moi savoir si vous avez des questions.
Il fonctionne maintenant avec une requête et un tableau HTML, mais maintenant le problème est total, il ne doit pas obtenir la somme correcte pour chaque sport, devrait être un total pour chaque sport. Comme vous pouvez le voir dans la mise à jour
@Eniol avez-vous exécuté mon exemple? Si oui, pouvez-vous télécharger une capture d'écran de la sortie?
@Eniol vous pouvez utiliser 2 sous-requêtes une pour chaque score de table pour le score total si vous ne parvenez pas à le faire en php. par exemple: (SELECT sum (score) FROM cricket_table WHERE dateby BETWEEN stdate et enddate) comme total,
chalo ok ye mai javascript mai karlonga.
N'incluez jamais d'opérateurs arithmétiques dans les identificateurs de table / colonne. Telle qu'elle est écrite, la requête ci-dessus ne peut pas fonctionner, il y a donc quelque chose que vous ne nous dites pas
@Strawberry La question ne se soumettait pas sans cela. Parce qu'il demandait de plus en plus d'explications.
Vous souhaitez donc fusionner les données de deux tables, puis les fractionner à nouveau. Mais pourquoi?
@PaulSpiegel Je veux afficher le nom de la table avec ses données associées comme en-tête. Et somme du score au pied de page pour chaque donnée de table.
Alors ne les fusionnez pas. Pourquoi tout le monde veut faire quelque chose avec une seule requête?
@PaulSpiegel parce qu'il y aura beaucoup de code, si j'utilise plusieurs requêtes 8 ou 9, et ses données de boucle while associées, ce sera difficile à gérer.
Laissez-moi deviner: vous avez 8 tables (une pour chaque sport) et elles se ressemblent toutes (ont les mêmes colonnes)?
@PaulSpiegel oui 8 table mais pas tout à fait la même chose.