Mysql
 sql >> Base de données >  >> RDS >> Mysql

boucle avec une requête et une table de recherche. mysql et php

J'ai fait de mon mieux pour nettoyer les choses, ce n'est peut-être pas parfait, mais cela devrait suffire comme un coup de pouce dans la bonne direction.

Déplacer la lookup classe vers table DB

Il me semble que vous seriez bien mieux servi ici en déplaçant l'intention de la lookup classe dans une table de base de données. Imaginez quelque chose comme ça :

CREATE TABLE IF NOT EXISTS `tbl_lookup` (
 `lookup_id` int(11) NOT NULL AUTO_INCREMENT,
 `rider_count` int NOT NULL,
 `heat_count` int NOT NULL,
 `riders_in_heat_1` int NOT NULL,
 `riders_in_heat_2` int,
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

puis insérez toutes vos données de la lookup classe.

Utilisez JOIN et GROUP BY dans votre première requête SQL

Vous devez déterminer le nombre de coureurs dans une épreuve et une classe données. Vous pouvez simplement REJOINDRE tbl_event_classes et tbl_event_entries puis GROUP BY tbl_event_entries.event_id pour obtenir ces décomptes.

SELECT tec.class_id, tec.event_id, COUNT(tee.event_id) AS entries_per_class
FROM tbl_event_classes tec
JOIN tbl_event_entries tee ON tee.event_id = tec.event_id
WHERE tec.event_id = :event_id
GROUP BY tee.event_id

Nettoyer le PHP

Maintenant, votre code PHP devrait être un peu plus facile à suivre. Une requête principale pour obtenir les événements et les classes avec le nombre de coureurs par événement et par classe. Ensuite, en boucle sur cet ensemble de résultats, déterminez le nombre de coureurs par manche.

C'est un peu rude, mais je suis sûr que vous pouvez le peaufiner à partir d'ici.

function getEntriesPerClass($event_id) {
    global $db;

    $stmt = $db->prepare(
        'SELECT tec.class_id, tec.event_id, COUNT(tee.event_id) AS entries_per_class ' .
        'FROM tbl_event_classes tec ' .
        'JOIN tbl_event_entries tee ON tee.event_id = tec.event_id ' .
        'WHERE tec.event_id = :event_id ' .
        'GROUP BY tee.event_id');

    $stmt->bindValue(':event_id', $event_id);
    $stmt->execute();

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

function getRidersInHeats($class_id, $event_id, $riders_per_class)
{
    global $db;

    $stmt = $db->prepare(
        'SELECT tl.riders_in_heat_1, tl.riders_in_heat_2 ' .
        'FROM tbl_lookup ' .
        'WHERE class_id = :class_id AND event_id = :event_id AND rider_count = :entries');

    $stmt->bindValue(':class_id', $class_id);
    $stmt->bindValue(':event_id', $event_id);
    $stmt->bindValue(':rider_count', $riders_per_class);

    $stmt->execute();

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

$entriesPerClass = getEntriesPerClass($_GET['event_id']);
foreach($entriesPerClass as $entry) {
    $riders = getRidersInHeats($entry['class_id'], $entry['event_id'], $entry['entries_per_class']);

    echo
        "class     : " . $row['class_id']       . "; " .
        "ridercount: " . $riders['rider_count'] . "; " .
        "heats     : " . $riders['heat_count']  . "<br/>";

    echo "Heats, consisting of :<br>\n<ul>";
    echo "<li>Heat 1: " . $riders['riders_in_heat_1'] . "</li>";

    $ridersInHeat2 = $riders['riders_in_heat_2'];
    if($ridersInHeat2 > 0) {
        echo "<li>Heat 2: " . $riders['riders_in_heat_2'] . "</li>";
    }

    echo "</ul>";
}