sql >> Databasteknik >  >> RDS >> Mysql

looping med en fråge- och uppslagstabell. mysql och php

Gjorde mitt bästa för att städa upp saker, kanske inte är perfekt, men borde räcka som en knuff i rätt riktning.

Flytta lookup klass till DB-tabell

Det verkar för mig som att du skulle vara mycket bättre behjälplig här när du flyttar avsikten med lookup klass till en databastabell. Föreställ dig något sånt här:

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;

infoga sedan alla dina data från lookup klass.

Använd JOINs &GROUP BY i din första SQL-fråga

Du måste bestämma antalet ryttare i en given tävling och klass. Du kan bara GÅ MED tbl_event_classes och tbl_event_entries sedan GROUP BY tbl_event_entries.event_id för att få dessa räkningar.

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

Rensa upp PHP

Nu borde din PHP-kod vara lite lättare att följa. En huvudfråga för att få evenemangen och klasserna med antalet ryttare per tävling och klass. När du sedan loopar över den resultatuppsättningen, bestäm antalet ryttare per heat.

Det här är lite grovt, men jag är säker på att du kan putsa upp det härifrån.

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. Hur man returnerar en sträng i omvänd ordning med SQL Server – REVERSE()

  2. pg_stat_activity uppdateras inte inom en procedur eller transaktion

  3. Hur kan jag ställa in en storleksgräns för en int-datatyp i PostgreSQL 9.5

  4. MySQL Error 1153 - Fick ett paket större än 'max_allowed_packet' byte