Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

lặp với một truy vấn và bảng tra cứu. mysql &php

Tôi đã cố gắng hết sức để dọn dẹp mọi thứ, có thể không hoàn hảo, nhưng đủ để giúp bạn đi đúng hướng.

Di chuyển lookup lớp thành bảng DB

Đối với tôi, có vẻ như bạn sẽ được phục vụ tốt hơn ở đây khi di chuyển mục đích của lookup lớp thành một bảng cơ sở dữ liệu. Hãy tưởng tượng một cái gì đó như thế này:

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;

sau đó chèn tất cả dữ liệu của bạn từ lookup lớp học.

Sử dụng JOIN &GROUP BY trong truy vấn SQL đầu tiên của bạn

Bạn cần xác định số lượng tay đua trong một sự kiện và hạng nhất định. Bạn chỉ có thể THAM GIA tbl_event_classestbl_event_entries sau đó GROUP BY tbl_event_entries.event_id để có được những số lượng đó.

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

Xóa PHP

Bây giờ mã PHP của bạn sẽ dễ theo dõi hơn một chút. Một truy vấn chính để nhận các sự kiện và lớp với số lượng người đi trên mỗi sự kiện trên mỗi lớp. Sau đó, khi bạn lặp lại tập hợp kết quả đó, hãy xác định số lượng người đi trên mỗi lượt nhiệt.

Điều này hơi khó, nhưng tôi chắc rằng bạn có thể hoàn thiện nó từ đây.

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. Điều gì sai với câu lệnh tạo bảng này?

  2. Ngăn chặn việc chèn ngày và giờ vào cơ sở dữ liệu

  3. PacketTooBigException khi chạy phân tích sonar

  4. Truy vấn MySQL - tìm người dùng mới mỗi ngày

  5. Làm cách nào để ngăn các bản ghi trùng lặp trong cơ sở dữ liệu của tôi khi cập nhật bản ghi?