0

問題に行き詰まったツアープロジェクトを作成しています。データベースを作成しました:

ID  Source   Destination

1     C1         C2
2     C3         c4
3     C3         C5
4     C4         C6
5     C8         C9
6     C2         C3

C1->C6 からツアーを作成している場合、パスは c1->c2->c3->c4->c6 に従う必要があります。しかし、クエリを介して取得すると、c3 に到達したときに競合が発生しました。別の C3->c5 があります。

どうすればこの問題を克服できますか?

最初に、mysqlをチェックインすることでc1をソースとして取得し、その宛先をソースチェック関連宛先として取得することで宛先を取得しています

4

2 に答える 2

1

1)データをfollとしてツリーに保存し、アルゴリズムを使用して宛先に到達することで解決できます。

ここに画像の説明を入力してください

2)配列と再帰を使用した簡単な解決策:

ここで複雑な部分は、「言及されたソースと宛先に必要なデータ」をもたらすこと、つまりc8->c9を残すことだけです。

私は次のデータを持ってくるために働いたことがありません。しかし、あなたはこれを先に進めることができます:$ destination ['c1'] ='c2'; $ destination ['c3'] [] ='c4'; $ destination ['c4'] ='c6'; $ destination ['c2'] ='c3';

$route = array();
$int = 0;

function route_to($route,$source_statn, $dest_statn) {
    global $int, $destination,$path;

    if ($source_statn != '' && $dest_statn != '') {
        if ($destination[$source_statn] == $dest_statn) {
            $route[++$int] = "$source_statn -> {$destination[$source_statn]}";

            $path = $route;
            return $path;
        } else {
            if (is_array($destination[$source_statn])) {
                foreach ($destination[$source_statn] as $each) {
                    $route[++$int] = "$source_statn -> $each";
                    route_to($route,$each, $dest_statn);
                }
            } else {
                if($destination[$source_statn] != ''){
                    $route[++$int] = "$source_statn -> {$destination[$source_statn]}";
                }
                route_to($route,$destination[$source_statn], $dest_statn);
            }
        }
    }
}

route_to($route,'c1','c6');

echo '<pre>path';
print_r($path);
echo '</pre>';

--------- o / p -----------

Array
(
    [1] => c1 -> c2
    [2] => c2 -> c3
    [3] => c3 -> c4
    [4] => c4 -> c6
)
于 2012-11-27T07:07:20.713 に答える
1

試す:

CREATE TABLE test (
  ID INTEGER NOT NULL,
  SOURCE CHAR(2) NOT NULL,
  DESTINATION CHAR(2) NOT NULL
);

INSERT INTO test VALUES (1, 'C1', 'C2');
INSERT INTO test VALUES (2, 'C3', 'C4');
INSERT INTO test VALUES (3, 'C3', 'C5');
INSERT INTO test VALUES (4, 'C4', 'C6');
INSERT INTO test VALUES (5, 'C8', 'C9');
INSERT INTO test VALUES (6, 'C2', 'C3');

それで:

SELECT
  CONCAT_WS(
    '->',
    A.SOURCE,
    A.DESTINATION,
    B.DESTINATION,
    C.DESTINATION,
    D.DESTINATION
  )
FROM test A
LEFT JOIN test B ON B.SOURCE = A.DESTINATION
LEFT JOIN test C ON C.SOURCE = B.DESTINATION
LEFT JOIN test D ON D.SOURCE = C.DESTINATION
WHERE
  A.SOURCE = 'C1'
  AND 'C6' IN (A.DESTINATION, B.DESTINATION, C.DESTINATION, D.DESTINATION);

これにより、次のことが得られます。

C1->C2->C3->C4->C6

この例では、最大深度が 4 のパスのみが提供されますが、これは簡単に拡張できることに注意してください。また、可能なすべてのパスを取得します (複数ある場合)。したがって、どちらを選択するかを決定する必要があります。

于 2012-11-27T10:06:46.537 に答える