2012-03-13 6 views
0

私はちょうどMySQLの学習を始めましたが、データベースからの一致するフライトを抽出するのに問題があります。私のデータベースには、アウトバウンドおよびリターンフライトが1週間離れた倍数の架空のフライトデータがあります。MySQLウェブプロジェクトの一致する発信と返信のフライトを返すクエリ

ユーザーが選択した出発日の+/- 3日間、出入りするフライトのペアが存在するかどうかを確認し、フェッチするクエリを設計しようとしています。私は、フライトをアウトバウンドフライトで注文し、その後、一致するリターンフライトをPHPのmysql_fetch_array whileループで出力する必要があります。

これまでのところ、私はWHERE句内の条件(WHERE句内の条件を選択してアウトバウンドフライトが存在するかどうかを確認しています)が実際に存在するかどうかを調べています。 1つの日付をテストするときにmysqlのwhileループを使用できない限り、それを日付範囲に統合する方法がわかりませんか?また、WHERE句内にIF文を置くのは理想的ではありません返却日がアウト日にユーザーフォーム(すなわち1週間、2週間など)で「継続」オプションを追加することにより、PHPで計算される。

時間。

私は私が持っているクエリのコードをコピーしましたこれまでのところ 私は希望の結果を達成するためのよりシンプルな/より良い方法があり、あらゆる指針に感謝します。私のコードは+/- 3日間の検索をどのように実装し、結果をアウトバウンドとリターンのフライトペアの順序で保持するかわからないので、それに供給された特定の日付だけの一致するフライトのペアを返します。

おかげで、 ゲイリー

SELECT 
sched.flight_schedule_id, dep_airport, dest_airport, code, dep_time, arr_time, flight_time, dep_date, dep.airport_name, dep.airport_country, adult_flight_price, dest.airport_name, dest.airport_country, plane.no_seats, sum(adult_seats_reserved), sum(child_seats_reserved) 

     FROM 
      flight fli 

      INNER JOIN flight_schedule sched 
      ON fli.flight_id = sched.flight_id 

      INNER JOIN airport dep 
      ON fli.dep_airport = dep.airport_code 

      INNER JOIN airport dest 
      ON fli.dest_airport = dest.airport_code 

      INNER JOIN plane_type plane 
      ON fli.plane_id = plane.plane_id 

      LEFT JOIN flight_inventory inv 
      ON sched.flight_schedule_id = inv.flight_schedule_id  

     WHERE 

     IF (EXISTS(SELECT 
      sched.flight_schedule_id, dep_airport, dest_airport, code, dep_time, arr_time, flight_time, dep_date, dep.airport_name, dep.airport_country, adult_flight_price, dest.airport_name, dest.airport_country 

      FROM 
       flight fli 

       INNER JOIN flight_schedule sched 
       ON fli.flight_id = sched.flight_id 

       INNER JOIN airport dep 
       ON fli.dep_airport = dep.airport_code 

       INNER JOIN airport dest 
       ON fli.dest_airport = dest.airport_code 

       LEFT JOIN flight_inventory inv 
       ON sched.flight_schedule_id = inv.flight_schedule_id 

      WHERE 


      dep.airport_name = '$to' AND dest.airport_name = '$from' AND sched.dep_date = '$return'), 

      (dep.airport_name = '$from' AND dest.airport_name = '$to' AND sched.dep_date = '$outdate') 

     OR 

      (dep.airport_name = '$to' AND dest.airport_name = '$from' AND sched.dep_date = '$return'), '') 

     GROUP BY 

      sched.flight_schedule_id 
+0

この質問は表の回路図を必要とします。あなたの質問からこれを推測するのは楽しいことではありません。 – Basti

答えて

0

これはあなたを助けるかもしれません。それはあなたの問題を解決すべき新鮮な解決策です。私はあなたの質問から多くのJOINを含んでいませんでしたが、それらを追加するのは簡単です。 +/- 3日間の作業を行うために、私はあなたのdep_dateがタイプTIMESTAMPであり、$outdate$returnunix timestampsであると仮定しました。 ABSはすなわちABS(-x) = ABS(x) = x

SELECT 
    * 
FROM 
    flight_schedule outbound 
JOIN 
    flight_schedule return 
    ON 
     /* return flights should depart from outbounds destination */ 
     outbound.dest_airport = return.dep_airport 
    AND 
     /* optional. might reduce intermediate join result size */ 
     outbound.arr_date < return.dep_date 

WHERE 
    /* user wants to fly from airport $from to airport $to */ 
    outbound.dep_airport = '$from' 
    AND outbound.dest_airport = '$to' 

    /* outbound flight should depart within 3 days before and after $outdate (3 days = 259200 seconds) */ 
    AND ABS(outbound.dep_date - $outdate) < 259200 

    /* return flight should depart within 3 days before and after $return */ 
    AND ABS(return.dep_date - $return) < 259200 

ORDER BY 
    /* order outbound flights by distance to user's requested $outdate */ 
    ABS(outbound.dep_date - $outdate) ASC, 

    /* and return flights by distance to user's requested $return date */ 
    ABS(return.dep_date - $return) ASC 

あなたが列dep_date用タイプDATEを持っている場合、あなたはまだMySQLのDATE_ADDDATE_SUB機能やDATEDIFF

を使用して

WHERE outbound.dep_date BETWEEN 
     DATE_SUB($outdate, INTERVAL 3 DAY) 
    AND DATE_ADD($outdate, INTERVAL 3 DAY) 

間等を使用することができ、ちょうど絶対値であり、
WHERE 
    ABS(DATEDIFF(outbound.dep_date, $outdate)) < 259200 

とDATEDIFFを使用してソートするよく

ORDER BY 
    ABS(DATEDIFF(outbound.dep_date, $outdate)) ASC, 
    ABS(DATEDIFF(return.dep_date, $return)) ASC 
+0

Basti、あなたは私のポストに答えるために行ったすべての努力のために非常に感謝!私は出国便と帰国便を合流させることはなかった。絶対値計算を使用して+/- 3日を計算することも天才です! flight_id番号でリンクされた2つのテーブル、フライト(フライトコード、出発地と目的地の空港を保持する)、flight_schedule(フライトが予定されている日付を保持する)私は座って適切な結合を見つけなければならないでしょう。もう一度、あなたの助けをありがとう! – user1267344

+0

私の喜び。さらなる質問がある場合は、お気軽にお問い合わせください。私はあなたの方法で小さなヒント:パフォーマンスや計算結果の計算方法を考慮しないでください。 SQLは宣言型言語です。つまり、**あなたが何を望んでいるのか** **どのように計算するのかを書いているだけです。可能なすべてのフライトの組み合わせに参加し、後で 'WHERE'を使用してその99%を削除する必要がある場合は、それだけで。とにかく、データベースサーバはおそらくクエリを最適化して書き換えます。動作中のクエリがある場合は、その時点で最適化に費やすことができます。しかしただの警告:SQLクエリの最適化は複雑な作業です! ;-) – Basti

関連する問題