別のクエリで使用するために、クエリの結果を一時的に保存する方法は?


12

私はあなたが私を助けるかもしれないと思うこの問題を抱えています。
PS私はこれをどのように呼ぶかわからないので、誰かがより適切なタイトルを見つけたら、編集してください。

バックグラウンド

  • このアプリケーションは、バス路線を検索するために作成しています。
  • バスラインは3桁の数字であり、一意であり、変更されることはありません。
  • 要件は、ストップAからストップBまでの行を検索できることです。
  • ユーザーインターフェイスは、有効なストップ名のみを使用するようにユーザーにヒントを出すことにすでに成功しています。
  • 要件は、ルートに直通線があるかどうかを表示でき、そうでない場合は2行と3行の組み合わせを表示できることです。

例:

ポイントAからポイントDに到達する必要があります。プログラムは次のように表示されます。

  • ダイレクトラインADがある場合。
  • そうでない場合は、AC、CDなど、2行の代替コンボを表示します。
  • 2行のコンボがない場合は、3行のコンボ(AB、BC、CD)を検索します。

もちろん、アプリはバスの路線番号とバスをいつ切り替えるかを表示する必要があります。

私が持っているもの:

私のデータベースは次のように構成されています(簡略化された、実際のデータベースには場所と時間などが含まれています):

+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+

+-------------------------------+
|    lines_stops_relationship   |
+-------------+---------+-------+
|  bus_line   | stop_id | order |
+-------------+---------+-------+

どこlines_stops_relationshipのバスラインと停止の間の多対多の関係を説明します。

順序、ストップが1行に表示される順序を示します。すべての行が行き来するわけではなく、順序に意味があります(順序2のポイントAは順序1のポイントBの後に来ます)。

問題

  • ラインがルートを十分簡単に​​通過できるかどうかを確認します。両方のポイントを正しい順序で通過する単一の行を検索するだけです。
  • 2/3行のコンボがあるかどうかを確認するにはどうすればよいですか?出発地の停留所と目的地の停留所に一致する行を検索し、それらの間に共通の停留所があり、ユーザーがバスを切り替えることができるかどうかを確認しようと考えていました。その停止をどのように覚えていますか?
  • 3行のコンボはさらにトリッキーです。ソースの行と宛先の行を見つけましたが、次に何をしますか?ストップが2つある行を検索しますが、繰り返しますが、ストップをどのように覚えていますか?

tl; dr

クエリの結果を覚えて、再び使用できるようにするにはどうすればよいですか?これを単一のクエリ(1行のルートのクエリ、2行のクエリ、3行のコンボのクエリ)で達成したいと考えています。

注:誰かが私が持っているものとはまったく異なるアプローチを提案するかどうかは気にしませんが、私はどんな解決策も受け入れています。

クッキーおよびアップ投票に関する支援を提供します。前もって感謝します!



@eggyal:ノード上に距離がありません。また、ネットワーク内の移動は制限されています(つまり、特定のバスラインのみがポイントAからポイントBに移動します)。私にとってまだ有用ですか?
マダラのゴースト

また、このために単一のクエリでストアドプロシージャを使用することをお勧めします-単一のクエリで実行できる場合もあります。そこで、結果/変数を簡単に保存して再利用できます。

1
@Truthおそらくあなたにいくつかのツットを与えるのが最善です:mysqltutorial.org/stored-procedures-loop.aspx(ループ)、mysqltutorial.org /…(ケース)-dijkstraアルゴリズムのようなものと組み合わせて、あなたはあなたを解決することができるはずです問題。基本的には、PHPの関数のようだ-が、MySQL上

1
すでにスタックオーバーフローが発生しているようです。現時点ではMySQLには何もありませんが、このリンクには複数のソリューションがあります。(簡単に要約できないいくつかの答えがあり、リンクの腐敗はおそらく問題ではありません。なぜなら、そのサイトがなくなると、おそらくこれも同様です。さらに、多くの賛成票があります)。
psr

回答:


3

この時点で劇的な変更を行うことは望ましくないかもしれませんが、説明するのはGraph Databasesのユースケースです。グラフデータベースはグラフ理論に基づいています。グラフ理論は、バス路線の有向グラフ上で「X」と「Y」の間のパスを見つけようとすることで触れています。

まだ調べていない場合は、Neo4Jのようなものを覗いてみてください。REST APIがあり、PHPクライアントを見つけることができます。

実装の側面を支援できるStack Overflowの人々がたくさんいます。


1
私は現在、思考段階にあり、何でも変更できます。リンクを確認します。また、この質問はStack Overflowから寄せられたもので、実装に役立つことがわかっています:)
マダラのゴースト

1
私は再帰クエリを提案するつもりでしたが、MySQLはそれらをサポートしていないようですので、この答えのほうが良いかもしれません。
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner SPと隣接リストを組み合わせる非常に厄介なMySQLソリューションがあるかもしれませんが、私はそれについて考える時間すら価値がないと思います。
ヤニス

@YannisRizos:多分、良いコードゴルフの挑戦かもしれませんね?;)
FrustratedWithFormsDesigner

1
@FrustratedWithFormsDesignerいやが、これは良いコードゴルフの挑戦である
ヤニス

0

のは、ユーザーから行きたいとしましょう$start_id$end_id(両方とも有効stop_id値です)。あなたはから有効なルートを見つけるためにこれらのクエリを使用すること$start_id$end_id

  1. 直接ルートを検索(単一行):

    SELECT *
    FROM bus_stops bs1, bus_stops bs2
    WHERE bs1.stop_id=$start_id AND bs2.stop_id=$end_id AND bs1.bus_line=bs2.bus_line
  2. 前のクエリで結果がない場合、2リグネを使用してルートを検索します。

    SELECT *
    FROM bus_stops bs1, bus_stops bs2, bus_stops bs3, bus_stops bs4
    WHERE bs1.stop_id=$start_id
        AND bs1.bus_line=bs2.bus_line
    AND bs2.stop_id=bs3.stop_id
        AND bs3.bus_line=bs4.bus_line
    AND bs4.stop_id=$end_id

*本当に取得する必要があるフィールドに置き換えます。


ジョセリンさん、こんにちは!編集ヘルプページをよくお読みになり、Markdownを最大限に活用する方法をご確認ください。今回は回答を編集しました。改訂履歴を確認して、編集内容を確認できます。
ヤニス

同じデータベースから連続して4回選択するのはなぜですか?
マダラのゴースト

ルートを完了するためにもう1本のバスライン(bus_stops bs5)が必要な場合はどうなりますか?
FrustratedWithFormsDesigner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.