mysql - 結合 - SQLへの方法1対多のリレーションを選択し、出力をマージします



sql 中間 テーブル (2)

ただし、必要に応じて複数の外部キーを設定している限り、キーをより高速に索引付けするようにしてください。

位置と座標に外部キーuser.idがある限り、上記のように複数の結合を行うことができることを確認してください

私は数日前に実際に(場所/座標と関係があると面白いほど)同様の質問に答えました、残念なことに、私は今夜リンクをクリックして私のプロフィールを閲覧することはできません。

https://src-bin.com

これは私が解決策に近づいてから劇的に更新されました

私はタイトルが最高ではないと思うが、私はそれをより良く説明する方法を知らなかった。

私は2つの関連テーブルに座標を持つ場所を持っています。 テーブルのlocations(id, name, description, created_at)locations_coordinates(location_id, lat, lng, coordinates_order)

私は座標(ポリゴン)が不明なので、2つのテーブルを使用しています。

今私は次のクエリを実行しています

SELECT l.id, 
   l.name, 
   l.description, 
   l.created_at, 
   GROUP_CONCAT(Concat(c.lat, ":", c.lng) ORDER BY c.coordinate_order ASC 
   SEPARATOR 
   ', ') AS coordinates 
FROM   locations l 
   LEFT JOIN locations_coordinates c 
     ON l.id = c.location_id 
WHERE  l.id = ' . $id . ' 
GROUP  BY l.id, 
      l.name, 
      l.description, 
      l.created_at ASC 

だから私は次の出力を得る(ID = 3を使用)

[
{
  "id":"3",
  "name":"Stadthalle",
  "description":"Die Wiener Stadthalle",
  "created_at":"2012-01-07 14:22:06",
  "coordinates":"48.201187:16.334213, 48.200665:16.331606, 48.202989:16.331091,     48.203075:16.334192"
}
] 

私が得たいのは、緯度と経度の組み合わせです。

[
{
  "id":"3",
  "name":"Stadthalle",
  "description":"Die Wiener Stadthalle",
  "created_at":"2012-01-07 14:22:06",
  "coordinates":[
     [
        "48.201187,16.334213"
     ],
     [
        "48.200665,16.331606"
     ],
     [
        "48.202989,16.331091"
     ],
     [
        "48.203075,16.334192"
     ]
  ]
}
]

だから私の質問です:SQLだけで必要な出力を得る方法はありますか? そうでなければ、私のクエリを改善して、アプリケーションコード(PHP for me)で簡単に実行できますか?

更新:

私はMyISAMを使用しており、 "locations_id"と "coordinates_order"はPRIMARYで "coordinates_order"はAUTO INCREMENTに設定されているので、挿入されたときに常に新しい一連の注文番号を開始します。 (私はこれを必要とするので、後で正しい順序で座標を選択することができます)。


Answer #1

私はこのようにして同様の問題を解決します:

まず、必要なすべてのロケーションレコードを取得し、IDをキーとしてハッシュマップに配置します。

次に、locationレコード内のlocation_idがidを記録するすべての座標レコードを取得します。 たぶん:select * from coordinate where location_id in(?、?、...)

第3に、座標レコードを反復し、対応する位置レコードに緯度および経度列を設定する。

ロケーション・レコードのサイズが大きすぎない場合は、2つのSQLステートメントしか必要ありません。 したがって、より良いパフォーマンスを得ることができます。





join