0

今週の航空機検査スケジュールを格納するために使用されるテーブルがあります。これは と呼ばれaircraft_schedます。関連する他の 2 つのテーブルがありaircraft_sched_optionsます。JOINaircraft

aircraft_sched:

column 1: AC_Reg (VARCHAR)(10),(PK),(FK -> `aircraft` PK)
column 2: Sched_Day1 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 3: Sched_Day2 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 4: Sched_Day3 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 5: Sched_Day4 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 6: Sched_Day5 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 7: Sched_Day6 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 8: Sched_Day7 (INT)(1),(FK -> `aircraft_sched_options` PK)

aircraft_sched_options:

column 1: SchedOpt_ID (INT)(1),(PK)
column 2: SchedOpt_Name (VARCHAR)(10)
column 3: SchedOpt_Color (VARCHAR)(7),

aircraft

column 1: AC_Reg (VARCHAR)(10),(PK)
column 2: AC_SN  (VARCHAR)(6)
column 3: AC_Year (VARCHAR)(4)

システムに新しい航空機が追加されると、私はそれを持っているので、それもaircraft_schedテーブルに追加されます。これが正しい方法だとは思いませんが、それが今のやり方です。そのため、aircraft_schedテーブルには常に が入力されAC_RegSched_DayXセルは選択したスケジュール タイプに対応する0forNULLまたは数値のいずれかになります。SchedOpt_ID

私が直面している問題はJOINSched_DayX列を列にしようとするときですSchedOpt_ID。列が 1 つだけの場合は機能しJOINますが、複数の列を実行しようとすると、結果から行が消えてしまいます。

「一種の」動作する私のコードは次のとおりです。

<?php
$sql = ("
          SELECT 
             * 
          FROM 
             aircraft_sched 
          INNER JOIN aircraft_sched_options AS aso1 
             ON aircraft_sched.Sched_Day1 = aso1.SchedOpt_ID
");

if(!$result_sql = $mysqli->query($sql))
{
    echo QueryCheck("getting the aircraft schedule ","from the aircraft sched",$mysqli) . "Error No: " .$mysqli->errno;
}

while($ACSched = $result_sql->fetch_assoc())
{
    echo "<tr>";
    echo "<td class=\"ACSched_Reg\">" . $ACSched['AC_Reg'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "</tr>";
}
?>

「ある程度」機能するとは、結果として実際に何かを表示することを意味します。機能しない理由は、スケジュール タイプが割り当てられた日が 1 日しかない場合でも、各セルに同じ結果が表示されるためです。

次のように、クエリに2 番目を追加すると、次JOINのようになります。

$sql = ("
          SELECT 
            * 
          FROM 
            aircraft_sched 
          INNER JOIN aircraft_sched_options AS aso1 
            ON aircraft_sched.Sched_Day1 = aso1.SchedOpt_ID
          INNER JOIN aircraft_sched_options AS aso2 
            ON aircraft_sched.Sched_Day2 = aso2.SchedOpt_ID
 ");

...その後、レコードを持つ行は返されません。

JOIN私はsとそれらがどのように機能するかを読んでいますが、問題を解決するために私が考えることができる唯一の方法はAC_Reg、それぞれの曜日をUNIQUE列に設定できるように、それぞれに個別のテーブルを用意することですが、私は信じていませんそれがタスクを達成するための最良の方法です。

編集:

見やすくするためのスクリーン ショットを次に示します。

aircraft_sched:

航空機スケジュール

aircraft_sched_options:

aircraft_sched_options

私のコード:

phpコード

画面表示:

画面に表示されるもの

4

2 に答える 2

1

私があなたの質問を正しく理解していればtbl_two 、各列のテーブルとの結合が必要ですDay:

SELECT 
    aircraft_sched.AC_SN,
    IF(
       aso1.SchedOpt_Name IS NULL OR aso1.SchedOpt_ID = 0, 
       '-', 
       aso1.SchedOpt_Name
    ) as option1,
    IF(
       aso2.SchedOpt_Name IS NULL OR aso2.SchedOpt_ID = 0, 
       '-', 
       aso2.SchedOpt_Name
    ) as option2
FROM 
    aircraft_sched 
LEFT JOIN aircraft_sched_options AS aso1 
    ON aircraft_sched.Sched_Day1 = aso1.SchedOpt_ID
LEFT JOIN aircraft_sched_options AS aso2 
    ON aircraft_sched.Sched_Day2 = aso2.SchedOpt_ID

....

編集:クエリを更新し、オプションを取得するLEFT JOIN代わりに使用しました。INNER JOINNULL

UPDATE :結合を削除し、オプションが null または id が 0 の場合に表示されるaircraftチェックを追加しました-

于 2013-04-17T11:36:19.223 に答える
0

クエリのロジックに従います。Day1 == Day2 == Day3 == ... == Day7 の tbl_one の行と、値も tbl_two.Day_ID に等しい行のみが表示されます。これは役に立ちますか?

SELECT * FROM tbl_one INNER JOIN tbl_two
    ON tbl_one.Day1 = tbl_two.Day_ID 
WHERE 
      tbl_one.Day1 = tbl_one.Day2
  AND tbl_one.Day1 = tbl_one.Day3
  AND tbl_one.Day1 = tbl_one.Day4
  AND tbl_one.Day1 = tbl_one.Day5
  AND tbl_one.Day1 = tbl_one.Day6
  AND tbl_one.Day1 = tbl_one.Day7
于 2013-04-17T09:58:27.527 に答える