0

私はこのテーブルを持っています、この画像からここにベースのSQLFiddle道

CREATE TABLE Table1 (
`id` INT( 11 ),
`Segment` VARCHAR( 5 ),
`Distance` FLOAT( 5, 2 ),
`startX` FLOAT( 5, 2 ),
`startY` FLOAT( 5, 2 ),
`endX` FLOAT( 5, 2 ),
`endY` FLOAT( 5, 2 )
);
INSERT INTO Table1 
(`id`, `Segment`, `Distance`, `startX`, `startY`, `endX`, `endY`)
VALUES
(1, 'AB', 14.00, -20.00, -19.00, -34.00, -19.00),
(2, 'BC', 15.56, -9.00, -8.00, -20.00, -19.00),
(3, 'CD', 19.00, 10.00, -8.00, -9.00, -8.00),
(4, 'DE', 21.00, 10.00, -29.00, 10.00, -8.00),
(5, 'EF', 11.31, 18.00, -37.00, 10.00, -29.00),
(6, 'FG', 26.66, 42.00, -37.00, 18.00, -37.00),
(7, 'DH', 43.00, 53.00, -8.00, 10.00, -8.00),
(8, 'HI', 22.63, 69.00, -24.00, 53.00, -8.00),
(9, 'HJ', 13.00, 53.00, 5.00, 53.00, -8.00),
(10, 'JK', 14.14, 63.00, 15.00, 53.00, -5.00),
(11, 'KL', 21.00, 84.00, 15.00, 63.00, 15.00),
(12, 'LM', 14.14, 94.00, 25.00, 84.00, 15.00);

表では、各セグメントの長さはすでに指定されており、セグメントのxyの開始とxyの終了です。

質問#1、このテーブルからmysqlを使用してクエリを実行すると、合計パス距離がわかります。たとえば、ポイントAからEまでのパス距離を取得する場合は、合計距離AB + BC +CD+が得られます。 DE

ありがとう

4

4 に答える 4

0

単純なSQLクエリではこれを実行できないと合理的に確信しています。構造が常にツリーである場合は、エンドノードからルートまでのパスをたどる必要があります。そうでない場合は、ダイクストラのアルゴリズムのようなものを使用する必要があります。どちらのソリューションにも、SQLでは不可能な反復プロセスが必要です。ストアドプロシージャを使用して実行できる場合もありますが、これを呼び出すスクリプトで実行することをお勧めします。

于 2013-01-11T17:01:28.333 に答える
0
SELECT SUM(distance) 
  FROM table1 a  
 WHERE a.segment IN ('AB','BC','CD','DE');

IN文字列を動的に構築するためのコードを少し書くことができると思います。

于 2013-01-11T16:37:27.280 に答える
0

あなたはさまざまな可能性を繰り返すことについて話している。MySQL でそれを行うこともできますが (おそらくある種のプロシージャまたは関数を使用して)、通常は SQL を使用して実行するタスクではなく、通常はアプリ側で実行されます。

ポイントの数がそれほど多くない場合 (あなたの例では 13 です)、ポイントのすべてのタプルのテーブルを作成し、興味のある 2 つをクエリします。

CREATE TABLE distances (
  point1 VARCHAR(1),
  point2 VARCHAR(1),
  distance FLOAT(5,2)
);

開始点 (提供したすべての 1 セグメントのもの) を入力してから、次の行に沿って何かを行います。

INSERT INTO distances (point1, point2, distance) 
SELECT
  p1.point1 as point1,
  p2.point2 as point2,
  p1.distance + p2.distance as distance
FROM
  distances p1
INNER JOIN distances p2
  ON p1.point2 = p2.point1
于 2013-01-11T16:30:16.897 に答える
-1

これがあなたが探しているものだと思います。Char 操作を使用して、2 つの入力に基づいてパスの開始と終了を決定します。始点の最初の Char と終点の 2 番目の Char。

SELECT SUM(t.distance) FROM Table1 t
WHERE t.segment >= CONCAT('A',Char(ASCII('A')+1))
AND t.segment <= CONCAT(Char(ASCII('E')-1),'E')
于 2013-01-11T16:52:29.840 に答える