質問編集履歴

3 誤記

igaiga

igaiga score 135

2017/03/31 13:22  投稿

PHPの中でSQL文を書いて緯度経度から指定半径内の住所の一覧を得る方法
###前提・実現したいこと
PHPの中でSQL文を書いて緯度経度から指定半径内の住所の一覧を得たいと思います。
ベースのSQL文では正常に値を取得できましたが、
下記を参考に指定半径内の住所で絞り込もうとするとうまくできませんでした。
恐れ入りますが、アドバイス頂ければ幸いです。
[https://www.firstlogic.co.jp/blog/lab/raku/71](https://www.firstlogic.co.jp/blog/lab/raku/71)
WordPressを使用していますが、今回はあまり関係ないかと思いますので端折ります。
###ベースのSQL文
```
$result = $wpdb->get_results("
   SELECT post_title, id, m1.meta_value AS '_lat', m2.meta_value AS '_lnt', m3.meta_value AS 'googlemap'
   FROM $wpdb->posts
   INNER JOIN $wpdb->postmeta AS m1
   ON m1.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m2
   ON m2.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m3
   ON m3.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   WHERE post_type = 'areainfo'
   AND post_status = 'publish'    /* かつ公開済の記事 */
   AND m1.meta_key = '_lat'
   AND m2.meta_key = '_lnt'
   AND m3.meta_key = 'googlemap'
   ORDER BY post_date DESC
   LIMIT 5
");
```
上記の出力結果はこんな感じです。
> Array ( [0] => stdClass Object ( [post_title] => ソフィアタワー勝どき [id] => 562 [_lat] => 35.6584463 [_lnt] => 139.7735894 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき3丁目12-12";s:3:"lat";s:10:"35.6584463";s:3:"lng";s:11:"139.7735894";} ) [1] => stdClass Object ( [post_title] => クレストレジデンス [id] => 561 [_lat] => 35.6571881 [_lnt] => 139.7719590 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき5丁目5-14 ";s:3:"lat";s:10:"35.6571881";s:3:"lng";s:18:"139.77195900000004";} ) )
###試したSQL文:追記版
```
$areainfo_lat = "35.65821";
$areainfo_lnt = "139.777162";
$areainfo_lat = "35.6746700";
$areainfo_lnt = "139.7885380";
$result = $wpdb->get_results("
   SELECT post_title, id, m1.meta_value AS '_lat', m2.meta_value AS '_lnt', m3.meta_value AS 'googlemap'
,(6371 * ACOS(
   COS(RADIANS($areainfo_lat))
   * COS(RADIANS(m1.meta_value))
   * COS(RADIANS(m2.meta_value) - RADIANS($areainfo_lnt))
   + SIN(RADIANS($areainfo_lat))
   * SIN(RADIANS(m1.meta_value))
 )) AS distance
   FROM $wpdb->posts
   INNER JOIN $wpdb->postmeta AS m1
   ON m1.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m2
   ON m2.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m3
   ON m3.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   WHERE post_type = 'areainfo'
   AND post_status = 'publish'    /* かつ公開済の記事 */
   AND m1.meta_key = '_lat'
   AND m2.meta_key = '_lnt'
   AND m3.meta_key = 'googlemap'
 HAVING distance
 ORDER BY distance
   LIMIT 5
");
```
上記の出力結果はこんな感じです。
35.6746700139.7885380Array ( [0] => stdClass Object ( [post_title] => ソフィアタワー勝どき [id] => 562 [_lat] => 35.6584463 [_lnt] => 139.7735894 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき3丁目12-12";s:3:"lat";s:10:"35.6584463";s:3:"lng";s:11:"139.7735894";} [distance] => 2.2534462617295463 ) [1] => stdClass Object ( [post_title] => クレストレジデンス [id] => 561 [_lat] => 35.6571881 [_lnt] => 139.7719590 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき5丁目5-14 ";s:3:"lat";s:10:"35.6571881";s:3:"lng";s:18:"139.77195900000004";} [distance] => 2.453954933727737 ) )
Array ( [0] => stdClass Object ( [post_title] => ソフィアタワー勝どき [id] => 562 [_lat] => 35.6584463 [_lnt] => 139.7735894 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき3丁目12-12";s:3:"lat";s:10:"35.6584463";s:3:"lng";s:11:"139.7735894";} [distance] => 2.2534462617295463 ) [1] => stdClass Object ( [post_title] => クレストレジデンス [id] => 561 [_lat] => 35.6571881 [_lnt] => 139.7719590 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき5丁目5-14 ";s:3:"lat";s:10:"35.6571881";s:3:"lng";s:18:"139.77195900000004";} [distance] => 2.453954933727737 ) )
  • PHP

    28538 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • SQL

    3776 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

2 追記

igaiga

igaiga score 135

2017/03/31 12:35  投稿

PHPの中でSQL文を書いて緯度経度から指定半径内の住所の一覧を得る方法
###前提・実現したいこと
PHPの中でSQL文を書いて緯度経度から指定半径内の住所の一覧を得たいと思います。
ベースのSQL文では正常に値を取得できましたが、
下記を参考に指定半径内の住所で絞り込もうとするとうまくできませんでした。
恐れ入りますが、アドバイス頂ければ幸いです。
[https://www.firstlogic.co.jp/blog/lab/raku/71](https://www.firstlogic.co.jp/blog/lab/raku/71)
WordPressを使用していますが、今回はあまり関係ないかと思いますので端折ります。
###ベースのSQL文
```
$result = $wpdb->get_results("
   SELECT post_title, id, m1.meta_value AS '_lat', m2.meta_value AS '_lnt', m3.meta_value AS 'googlemap'
   FROM $wpdb->posts
   INNER JOIN $wpdb->postmeta AS m1
   ON m1.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m2
   ON m2.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m3
   ON m3.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   WHERE post_type = 'areainfo'
   AND post_status = 'publish'    /* かつ公開済の記事 */
   AND m1.meta_key = '_lat'
   AND m2.meta_key = '_lnt'
   AND m3.meta_key = 'googlemap'
   ORDER BY post_date DESC
   LIMIT 5
");
```
上記の出力結果はこんな感じです。
> Array ( [0] => stdClass Object ( [post_title] => ソフィアタワー勝どき [id] => 562 [_lat] => 35.6584463 [_lnt] => 139.7735894 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき3丁目12-12";s:3:"lat";s:10:"35.6584463";s:3:"lng";s:11:"139.7735894";} ) [1] => stdClass Object ( [post_title] => クレストレジデンス [id] => 561 [_lat] => 35.6571881 [_lnt] => 139.7719590 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき5丁目5-14 ";s:3:"lat";s:10:"35.6571881";s:3:"lng";s:18:"139.77195900000004";} ) )
###試したSQL文:追記版()
###試したSQL文:追記版
```
$areainfo_lat = "35.65821";
$areainfo_lnt = "139.777162";
$result = $wpdb->get_results("
   SELECT post_title, id, m1.meta_value AS '_lat', m2.meta_value AS '_lnt', m3.meta_value AS 'googlemap'
,(6371 * ACOS(
   COS(RADIANS($areainfo_lat))
   * COS(RADIANS(m1.meta_value))
   * COS(RADIANS(m2.meta_value) - RADIANS($areainfo_lnt))
   + SIN(RADIANS($areainfo_lat))
   * SIN(RADIANS(m1.meta_value))
 )) AS distance
   FROM $wpdb->posts
   INNER JOIN $wpdb->postmeta AS m1
   ON m1.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m2
   ON m2.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m3
   ON m3.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   WHERE post_type = 'areainfo'
   AND post_status = 'publish'    /* かつ公開済の記事 */
   AND m1.meta_key = '_lat'
   AND m2.meta_key = '_lnt'
   AND m3.meta_key = 'googlemap'
 HAVING distance
 ORDER BY distance
   LIMIT 5
");
```
```
上記の出力結果はこんな感じです。
35.6746700139.7885380Array ( [0] => stdClass Object ( [post_title] => ソフィアタワー勝どき [id] => 562 [_lat] => 35.6584463 [_lnt] => 139.7735894 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき3丁目12-12";s:3:"lat";s:10:"35.6584463";s:3:"lng";s:11:"139.7735894";} [distance] => 2.2534462617295463 ) [1] => stdClass Object ( [post_title] => クレストレジデンス [id] => 561 [_lat] => 35.6571881 [_lnt] => 139.7719590 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき5丁目5-14 ";s:3:"lat";s:10:"35.6571881";s:3:"lng";s:18:"139.77195900000004";} [distance] => 2.453954933727737 ) )
  • PHP

    28538 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • SQL

    3776 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1 変更

igaiga

igaiga score 135

2017/03/31 12:34  投稿

PHPの中でSQL文を書いて緯度経度から指定半径内の住所の一覧を得る方法
###前提・実現したいこと
PHPの中でSQL文を書いて緯度経度から指定半径内の住所の一覧を得たいと思います。
ベースのSQL文では正常に値を取得できましたが、
下記を参考に指定半径内の住所で絞り込もうとするとうまくできませんでした。
恐れ入りますが、アドバイス頂ければ幸いです。
[https://www.firstlogic.co.jp/blog/lab/raku/71](https://www.firstlogic.co.jp/blog/lab/raku/71)
WordPressを使用していますが、今回はあまり関係ないかと思いますので端折ります。
###ベースのSQL文
```
$result = $wpdb->get_results("
   SELECT post_title, id, m1.meta_value AS '_lat', m2.meta_value AS '_lnt', m3.meta_value AS 'googlemap'
   FROM $wpdb->posts
   INNER JOIN $wpdb->postmeta AS m1
   ON m1.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m2
   ON m2.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m3
   ON m3.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   WHERE post_type = 'areainfo'
   AND post_status = 'publish'    /* かつ公開済の記事 */
   AND m1.meta_key = '_lat'
   AND m2.meta_key = '_lnt'
   AND m3.meta_key = 'googlemap'
   ORDER BY post_date DESC
   LIMIT 5
");
```
上記の出力結果はこんな感じです。
> Array ( [0] => stdClass Object ( [post_title] => ソフィアタワー勝どき [id] => 562 [_lat] => 35.6584463 [_lnt] => 139.7735894 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき3丁目12-12";s:3:"lat";s:10:"35.6584463";s:3:"lng";s:11:"139.7735894";} ) [1] => stdClass Object ( [post_title] => クレストレジデンス [id] => 561 [_lat] => 35.6571881 [_lnt] => 139.7719590 [googlemap] => a:3:{s:7:"address";s:41:"東京都中央区勝どき5丁目5-14 ";s:3:"lat";s:10:"35.6571881";s:3:"lng";s:18:"139.77195900000004";} ) )
###試したSQL文
###試したSQL文:追記版()
```
$areainfo_lat = "35.65821";
$areainfo_lnt = "139.777162";
$result = $wpdb->get_results("
   SELECT post_title, id, m1.meta_value AS '_lat', m2.meta_value AS '_lnt', m3.meta_value AS 'googlemap'
,(6371 * ACOS(
   COS(RADIANS($areainfo_lat))
   * COS(RADIANS(_lat))
   * COS(RADIANS(_lng) - RADIANS($areainfo_lnt))
   * COS(RADIANS(m1.meta_value))
   * COS(RADIANS(m2.meta_value) - RADIANS($areainfo_lnt))
   + SIN(RADIANS($areainfo_lat))
   * SIN(RADIANS(_lat))
   * SIN(RADIANS(m1.meta_value))
 )) AS distance
   FROM $wpdb->posts
   INNER JOIN $wpdb->postmeta AS m1
   ON m1.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m2
   ON m2.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   INNER JOIN $wpdb->postmeta AS m3
   ON m3.post_id = $wpdb->posts.ID /* テーブルを結合-カスタムフィールド */
   WHERE post_type = 'areainfo'
   AND post_status = 'publish'    /* かつ公開済の記事 */
   AND m1.meta_key = '_lat'
   AND m2.meta_key = '_lnt'
   AND m3.meta_key = 'googlemap'
 HAVING distance <= 5.0
 HAVING distance
 ORDER BY distance
   LIMIT 5
");
```
  • PHP

    28538 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • SQL

    3776 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る