sql >> Databáze >  >> RDS >> Mysql

opakování s dotazem a vyhledávací tabulkou. mysql a php

Udělal jsem maximum, abych věci uklidil, nemusí to být dokonalé, ale jako postrčení správným směrem by to mělo stačit.

Přesuňte lookup třídy do DB tabulky

Zdá se mi, že by vám zde mnohem lépe posloužilo přesunutí záměru lookup třídy do databázové tabulky. Představte si něco takového:

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;

poté vložte všechna data z lookup třída.

V prvním SQL dotazu použijte JOINs &GROUP BY

Musíte určit počet jezdců v daném podniku a třídě. Stačí se PŘIPOJIT k tbl_event_classes a tbl_event_entries pak GROUP BY tbl_event_entries.event_id získat tyto počty.

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

Čištění PHP

Nyní by mělo být sledování vašeho PHP kódu o něco jednodušší. Jeden hlavní dotaz k získání událostí a tříd s počtem jezdců na událost a třídu. Poté, když budete opakovat tuto sadu výsledků, určete počet jezdců na jízdu.

Je to trochu drsné, ale jsem si jistý, že to odtud můžete vyleštit.

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. Použijte dotaz ve stylu SQL v Excelu pomocí VBA

  2. dynamicky předat název tabulky ve smyčce oracle for

  3. Vyjmout řetězec po prvním výskytu znaku

  4. Jaký je ekvivalent Oracle SQL Serveru SET NOCOUNT ON?