0

その日のフライトの視覚的なデイプランナー タイプの表現として、時間とパイロットの表を使用して、フライト スクールの予約データベースを作成しています。時々副操縦士が必要な航空機を手に入れるまで、私はそれをうまく機能させていました.

名簿に永続的に登録されているパイロット (プランナーで常に確認したいパイロット) と、時々使用されるパイロット (その日の予約が存在する場合にのみそこにいたい) があります。彼らはまた、プランナーでパイロットの独自の順序を設定できるようにしたかったのでint_LISTORDER、リストに順序を設定するフィールドをスタッフ レコードint_LISTORDERに作成しました。彼らのために。副操縦士をミックスに追加するために、予約により、機長のtxt_STAFFNAME2フィールドに加えてフィールドが追加されましたtxt_STAFFNAME

元のパイロットのみのバージョンで次のクエリを作成して、特定の日に予約があるすべてのパイロット ($tl_date変数) を選択し、スタッフ リストのパイロットのリストと一致してリスト順を取得し、それをリストオーダーが 500 未満のパイロットのリスト:

        (SELECT DISTINCT tbl_booking_details.txt_STAFFNAME AS txt_PILOT,
                           tbl_staff_details.int_LISTORDER AS int_ORDER
            FROM tbl_booking_details
            INNER JOIN tbl_staff_details
            ON
            tbl_staff_details.txt_PILOTNAME = tbl_booking_details.txt_STAFFNAME
            WHERE tbl_booking_details.date_DATE = '{$tl_date}'
                AND tbl_staff_details.txt_PILOTNAME !='--none--'
                AND tbl_booking_details.txt_COMPLETECODE !='CANCELLED')
            UNION
            (SELECT tbl_staff_details.txt_PILOTNAME AS txt_PILOT,
                    tbl_staff_details.int_LISTORDER AS int_ORDER
            FROM `tbl_staff_details`
            WHERE tbl_staff_details.bool_ISPILOT =1
                AND tbl_staff_details.bool_CURRENT =1
                AND tbl_staff_details.txt_PILOTNAME != '--none--'
                AND tbl_staff_details.int_LISTORDER <500)
            ORDER BY ".STAFF_LIST_ORDER;

このクエリは、私の MySQL の知識を少し広げたので、「tbl_booking_detail」のパイロット ( ) と副操縦士 ( ) のリストとそのリストUNIONを取得するステートメントの前に、クエリの最初の部分を変更する方法を考える必要があります。その特定の日に予約がある「tbl_staff_detail」からのオーダー ( ) を「txt_PILOT」および「int_ORDER」として 1 つのテーブルに格納します。WHERE 句のフィールドと値の名前がわかりやすいといいのですが。txt_STAFFNAMEtxt_STAFFNAME2int_LISTORDER

このクエリを新しい基準を満たすように変更する方法を教えてください。

よろしく

ブレードン。

編集:@bonCodigo

テーブルの詳細は次のとおりです (関係のない多くのフィールドを除く)。

tbl_booking_details
------------------------------------------------------------------------------
ID   |   txt_STAFFNAME | txt_STAFFNAME2 |  date_DATE | txt_COMPLETECODE  | ...
------------------------------------------------------------------------------
475  | Joe A           | Joe B          | 2013-01-14 | CONFIRMED         | ...
------------------------------------------------------------------------------
476  | Joe A           | --none--       | 2013-01-14 | CONFIRMED         | ...
------------------------------------------------------------------------------
476  | Joe C           | Joe A          | 2013-01-14 | CANCELLED         | ...
------------------------------------------------------------------------------
477  | Joe B           | Jane D         | 2013-01-14 | CONFIRMED         | ...
------------------------------------------------------------------------------
478  | Joe E           | Jane D         | 2013-01-14 | CONFIRMED         | ...
------------------------------------------------------------------------------



tbl_staff_details
----------------------------------------------------------------------------
ID | txt_PILOTNAME | bool_CURRENT| bool_ISPILOT |  int_LISTORDER | ...
----------------------------------------------------------------------------
1  | --none--      | 1           | 1            |  0             | ...
----------------------------------------------------------------------------
2  | Joe A         | 1           | 1            |  5             | ...
----------------------------------------------------------------------------
4  | Joe B         | 1           | 1            |  15            | ...
----------------------------------------------------------------------------
5  | Joe C         | 1           | 1            |  510           | ...
----------------------------------------------------------------------------
6  | Jane D        | 1           | 1            |  20            | ...
----------------------------------------------------------------------------
7  | Joe E         | 1           | 1            |  520           | ...
----------------------------------------------------------------------------

望ましい結果:

--------------------------
| txt_PILOT |  int_ORDER |
--------------------------
| Joe A     |  5         |
--------------------------
| Joe B     | 15         |
--------------------------
| Jane D    | 20         |
--------------------------
| Joe E     | 520        |
--------------------------
4

1 に答える 1

0

さらなる調査の後、「間違った角度」から来た可能性があるため、元のソリューションを過度に設計または複雑にした可能性があるようです。クエリを完全に再考し、スタッフ テーブルをクエリの右側ではなく左側として使用すると、次のように動作するように見えます。

SELECT DISTINCT tbl_staff_details.txt_PILOTNAME AS txt_PILOTNAME,
                tbl_staff_details.int_LISTORDER AS int_LISTORDER
    FROM tbl_staff_details,tbl_booking_details
    WHERE tbl_booking_details.date_DATE = '{$tl_date}'
        AND tbl_booking_details.txt_COMPLETECODE != 'CANCELLED'
        AND tbl_staff_details.txt_PILOTNAME != '--none--'
        AND (tbl_staff_details.txt_PILOTNAME = tbl_booking_details.txt_STAFFNAME
         OR tbl_staff_details.txt_PILOTNAME = tbl_booking_details.txt_STAFFNAME2)
UNION
    SELECT tbl_staff_details.txt_PILOTNAME AS txt_PILOTNAME,
                tbl_staff_details.int_LISTORDER AS int_LISTORDER
    FROM `tbl_staff_details`
    WHERE tbl_staff_details.bool_ISPILOT =1
        AND tbl_staff_details.bool_CURRENT =1
        AND tbl_staff_details.txt_PILOTNAME != '--none--'
        AND tbl_staff_details.int_LISTORDER <500
    ORDER BY int_LISTORDER ASC, txt_PILOTNAME ASC

単純な JOIN を使用するだけです。インデックスが 500 を超えるパイロットと副操縦士がいる場合にのみ、最初のパイロットの名前を返す可能性があると考えていましたが、その日の予約が 1 つあり、両方のパイロットが 500 を超えている場合は、両方が返されるので、成功です!

何も投稿したり解決策を思いついたりしなくても、見て考えてくれた人に感謝します。

乾杯

ブレイドン

于 2013-01-15T01:01:19.347 に答える