sql >> Database teknologi >  >> RDS >> Mysql

looping med en forespørgsels- og opslagstabel. mysql og php

Gjorde mit bedste for at rydde op i tingene, er måske ikke perfekt, men burde være tilstrækkeligt som et skub i den rigtige retning.

Flyt lookup klasse til DB-tabel

Det forekommer mig, at du ville være meget bedre tjent her med at flytte hensigten med lookup klasse ind i en databasetabel. Forestil dig noget som dette:

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;

indsæt derefter alle dine data fra lookup klasse.

Brug JOINs &GROUP BY i din første SQL-forespørgsel

Du skal bestemme antallet af ryttere i en given begivenhed og klasse. Du kan bare TILMELDE dig tbl_event_classes og tbl_event_entries derefter GROUP BY tbl_event_entries.event_id for at få disse optællinger.

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

Rydning af PHP

Nu skulle din PHP-kode være lidt nemmere at følge. Én hovedforespørgsel for at få begivenhederne og klasserne med antallet af ryttere pr. stævne pr. klasse. Når du derefter går over det resultatsæt, skal du bestemme antallet af ryttere pr. heat.

Det her er lidt groft, men jeg er sikker på, at du kan få det poleret op herfra.

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>";
}


  1. vælg og tæl rækker

  2. Hvordan EXTRACTVALUE() virker i MariaDB

  3. Hvordan forbinder/kombinerer man to tabeller, når man eksporterer Mysql-data til Excel Download?

  4. Hvorfor kan pg_restore returneringsmulighederne -d/--dbname og -f/--file ikke bruges sammen?