2

誰かが私を助けてくれるかどうか疑問に思っていました。

次の 2 つのテーブル、位置とポリゴンがあります。

positions:
----------------------------------------------
| positionID | name        | information
----------------------------------------------
| 1          | Southampton | text here
| 2          | London      | text here

.

polygons:
-------------------------------------------------------------------
| polygonID | positionID | lat           | lon
-------------------------------------------------------------------
| 1         | 1          | 434343.034343 | -43.4343434
| 2         | 1          | 343343.034343 | -43.4343434
| 3         | 1          | 434343.034343 | -54.4343434

2つのテーブルを結合して、以下の形式で配列として出力したいです。

$positions = array(
               array( positionID => 1, 
                      name => 'Southampton',
                      information => 'text here',
                      polys =>  array( array( Lat => 54.54299483853406, 
                                      Lng => -6.5224456787109375,
                                     ),
                                array( Lat => 54.648809788121866, 
                                       Lng => -6.405029296875,
                                     ),
                                array( Lat => 54.54020652089137, 
                                       Lng => -6.39129638671875,
                                     ),
                                ),
               ),
       );

次の結合ステートメントを書きましたが、次のステップで本当に行き詰まっています。

SELECT * FROM (`positions`) LEFT JOIN `polygons` ON `positions`.`positionID` = `positions`.`positions`

結合からの緯度/経度データは、配列の「polys」キーに格納する必要があります。

ヘルプやアドバイスをいただければ幸いです。

どうもありがとう

4

2 に答える 2

0

必要なクエリは 1 つだけですが、PHP で結果を処理する必要があります。

$sql = "SELECT * FROM positions
    LEFT JOIN polygons ON positions.positionID = polygons.positionID";
$result = mysql_query($sql);
if (mysql_num_rows($result) > 0) {
    $positions = array();
    while ($row = mysql_fetch_assoc($result)) {
        if (!isset($positions[$row['name']])) {
            $positions[$row['name']] = array(
                'positionID' => $row['positionID'],
                'information' => $row['information'],
                'polys' => array()
                );
        }
        $positions[$row['name']]['polys'][] = array(
            'lat' => $row['lat'],
            'lon' => $row['lon']
            );
    }

    print_r($positions);
}

これは、実際にはポリゴン情報を持たない位置も返します。これを防ぐには、単に を に変更LEFT JOINJOINます。

どちらが最も効率的かについては、残念ながら答えがわかりません。最善の策は、可能であれば、この方法と Puggan Se が推奨する方法の両方をベンチマークすることです。

于 2012-07-06T12:02:18.027 に答える
0

positionID ごとに複数の polygonID がある場合は、多数の位置のコピーをフェッチすることになります。代わりに 2 つのクエリを実行することをお勧めします。

$positions = array();

$query_1 = "SELECT * FROM positions";
$query_2 = "SELECT * FROM polygons";

$resource_1 = mysql_query($query_1);

while($position = mysql_fetch_assoc($resource_1))
{
    $positions[$position['positionID']] = $position;
    $positions[$position['positionID']]['polys'] = array();
}

$resource_2 = mysql_query($query_2);

while($polygon = mysql_fetch_assoc($resource_2))
{
    $positions[$polygon['positionID']]['polys'][$polygon['polygonID']]['Lat'] = $polygon['lat'];
    $positions[$polygon['positionID']]['polys'][$polygon['polygonID']]['Lon'] = $polygon['lon'];
}

(私の例で mysql_query のような非推奨の関数を使用して申し訳ありません)

于 2012-07-06T11:52:52.327 に答える