sql >> Database >  >> RDS >> Mysql

looping met een query en opzoektabel. mysql &php

Heb mijn best gedaan om dingen op te ruimen, misschien niet perfect, maar zou voldoende moeten zijn als een duwtje in de goede richting.

Verplaats lookup class naar DB-tabel

Het lijkt me dat je hier veel beter geholpen zou zijn met het verplaatsen van de bedoeling van de lookup class in een databasetabel. Stel je zoiets voor:

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;

voer vervolgens al uw gegevens in uit de lookup klasse.

Gebruik JOINs &GROUP BY in uw eerste SQL-query

U moet het aantal rijders in een bepaald evenement en een bepaalde klasse bepalen. Je kunt gewoon DEELNEMEN aan tbl_event_classes en tbl_event_entries dan GROUP BY tbl_event_entries.event_id om die tellingen te krijgen.

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

De PHP opschonen

Nu zou je PHP-code een beetje gemakkelijker te volgen moeten zijn. Eén hoofdquery om de evenementen en klassen te krijgen met het aantal rijders per evenement per klasse. Bepaal vervolgens, terwijl je die resultatenset doorloopt, het aantal renners per heat.

Dit is een beetje ruw, maar ik weet zeker dat je het vanaf hier kunt oppoetsen.

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. Hoe een MySql-functie te beloven met behulp van bluebird?

  2. rails - postgres-fout:Reden:Incompatibele bibliotheekversie:libpq.5.dylib vereist versie 1.0.0 of hoger,

  3. Werken met bestandsaanwijzers op een csv

  4. COALESCE alle velden in verschillende tabellen JOIN