Mysql
 sql >> база данни >  >> RDS >> Mysql

зацикляне със заявка и справочна таблица. mysql и php

Дадох всичко от себе си, за да изчистя нещата, може да не е перфектно, но трябва да е достатъчно като тласък в правилната посока.

Преместване на lookup клас към DB таблицата

Струва ми се, че ще бъдете много по-добре обслужени тук, ако преместите намерението на lookup клас в таблица на база данни. Представете си нещо подобно:

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;

след това вмъкнете всичките си данни от lookup клас.

Използвайте JOINs &GROUP BY в първата си SQL заявка

Трябва да определите броя на състезателите в дадено събитие и клас. Можете просто да се ПРИСЪЕДИНЕТЕ към tbl_event_classes и tbl_event_entries след това GROUP BY tbl_event_entries.event_id за да получите тези преброявания.

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

Почистване на PHP

Сега вашият PHP код трябва да е малко по-лесен за следване. Една основна заявка за получаване на събитията и класовете с броя на ездачите за събитие за клас. След това, докато преминавате през този набор от резултати, определете броя на състезателите на серия.

Това е малко грубо, но съм сигурен, че можете да го излъскате от тук.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изтрия всички таблици от базата данни с manage.py CLI в Django?

  2. Как да конвертирате цял набор от символи и съпоставяне на MySQL база данни в UTF-8?

  3. MySQL Изберете редове при първото появяване на всяка уникална стойност

  4. Заявка за бавно преброяване с клауза where

  5. Не може да се сумира кумулативно „COUNT(*)“.