中心緯度からの距離で結果を並べ替え、半径内に制限するタグベースの検索を作成しようとしています。必要なテーブルを結合し、半径のものでもフィルタリングするSQLの書き方がわかりません。
以下のコメント付きコードに示すように、codeiginiters アクティブ レコードを使用して最初の非半径認識クエリを作成しました。これにより、$sql に示す SQL が生成されます。
public function search_subjects_tag_radius($string, $lat = null, $lon = null, $rad=null){
/*
$this->db->where("subject_tags.string_en","$string");
$this->db->from('subject_tags');
$this->db->join('subject_to_tag', 'subject_to_tag.tag_id = subject_tags.id');
$this->db->join('subject', 'subject.id = subject_to_tag.subject_id');
$this->db->limit("10");
$result = $this->db->get();
return $result -> result_object();
*/
$sql = "SELECT *
FROM (`subject_tags`)
JOIN `subject_to_tag` ON `subject_to_tag`.`tag_id` = `subject_tags`.`id`
JOIN `subject` ON `subject`.`id` = `subject_to_tag`.`subject_id`
WHERE `subject_tags`.`string_en` = '%$string%'
LIMIT 10
";
$result = $this->db->query($sql)->result_object();
return $result;
return $result;
}
これは、タイトルのみで半径検索を行うために使用した作業コードです(結合なし:
$sql2 = "SELECT *, ( 3959 * acos( cos( radians($lat) ) * cos( radians( lat ) ) * cos( radians( subject.long ) - radians($lon) ) + sin( radians($lat) ) * sin( radians( lat ) ) ) )
AS distance
FROM subject
WHERE `title` LIKE '%$string%'
OR `address` LIKE '%$string%'
HAVING distance < 10 ORDER BY distance LIMIT 6";
テーブル関係のセットアップ:
その ID の書き方が知りたい場合は、$sql2 の半径機能を $sql のクエリに追加したいと思います。
ありがとう。