sql >> データベース >  >> RDS >> Mysql

クエリとルックアップテーブルでループします。 mysql&php

    物事を片付けるために最善を尽くしました。完璧ではないかもしれませんが、正しい方向への微調整としては十分なはずです。

    ルックアップを移動します クラスから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からすべてのデータを挿入します クラス。

    最初のSQLクエリでJOINとGROUPBYを使用する

    特定のイベントとクラスのライダーの数を決定する必要があります。 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 items_per_classFROM tbl_event_classes tecJOIN tbl_event_entries tee ON tee.event_id =tec.event_idWHERE tec.event_id =:event_idGROUP BY tee.event_id  

    PHPのクリーンアップ

    これで、PHPコードを少しわかりやすくすることができます。クラスごとのイベントごとのライダーの数でイベントとクラスを取得するための1つの主要なクエリ。次に、その結​​果セットをループしながら、ヒートごとのライダーの数を決定します。

    これは少しラフですが、ここから磨き上げることができると確信しています。

      function getEntriesPerClass($ event_id){グローバル$ db; $ stmt =$ db-> prepare('SELECT tec.class_id、tec.event_id、COUNT(tee.event_id)ASentries_per_class'。'FROMtbl_event_classestec'。'JOINtbl_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'。'FROMtbl_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']);エコー"クラス:"。 $row['class_id']。 ";"。 "ridercount:"。 $riders['rider_count']。 ";"。 "ヒート:"。 $riders['heat_count']。 "
    "; echo "熱、からなる:
    \ n
      "; echo "
    • ヒート1:"。 $riders['riders_in_heat_1']。 "
    • "; $ ridersInHeat2 =$ riders ['riders_in_heat_2']; if($ ridersInHeat2> 0){echo "
    • Heat 2:"。 $riders['riders_in_heat_2']。 "
    • "; } echo "
    ";}


    1. SQLDeveloperで複数値パラメータのバインドを入力する方法

    2. MySQLでテーブルを削除するSQLクエリ

    3. MariaDB JSON_LOOSE()の説明

    4. CTEが複雑で強力なクエリの作成をどのように支援できるか:パフォーマンスの観点