2016-08-19 12 views
-1

上の基準に検索:は私が</p> <p>目標テーブル下のスキーマを持つテーブル持っているテーブルとサブテーブル

id (int) 
user_id (int) 
location (string) from Google places 
latitude 
longitude 
gender (int) 1 male,2 female, 3 both 
fromdate (date) 
todate (date) 

目標は、テーブルを趣味:

_id (int) 
goal_id (int) 
user_interest__id (int) 

したがって、ユーザーがゴールに入ります。私はフロリダ州タンパ(Tampa)にいる2016-08-18から2016-09-18まで、ボート(interest_id 3)、サイクリング(interest_id 4)、フィッシング(interest_id 6)の男性または女性(3)を探しています

これをPgSQLでどのように書くのですか?私は結合についていくつかのドキュメントを読んでいますが、興味のあるものを扱う最良の方法はわかりません。ユーザーは「ゴール」を作成するときに1から3の関心を入力することができます

少なくとも1つの類似した関心を持つ人と一致する必要があります。&から1または2の間のタンパになる予定です性別ID。

+1

まあ、開発をこのフォーラムに委託することはできません。自分で文書を読んでみたくない場合は、誰かに支払う。 –

+0

@Ehask use join、 – Santhucool

+0

私はローレンズのスケジュールを4ヶ月遅らせてしまいました。私はプロジェクトを取り戻し、私たちが支払ったもののいくつかを救済しようとしています。私はAPIコードのほとんどを書き直しています........ – Ehask

答えて

1

3つの問題を最初に検討する:

  1. あなたのアプリケーションのロジックは、おそらくユーザーの目標と関心のデータが最初に表にして、格納されていることです一致する目標について検索が行われます。したがって、以下のクエリでは、自己結合とサブクエリを使用してそのような一致を検索します。
  2. fromdatetodateの代わりにdaterangeタイプを使用する必要があります。 PGには、日付範囲に対して強力な演算子がいくつかあります。だから、あなたのテーブルにはdates daterangeという列があると仮定します。
  3. 場所の文字列を検索するのではなく、(経度、緯度)対、および旅行者がそのソウルメイトを見つけるために移動する可能性のある最大距離で検索してください。それ以外の場合、サンクトペテルブルクやクリアウォーターでの完璧な試合は気づかれません。このためには、別のlongitudelatitudeの列を別の種類に変換する必要があります。あなたは2つの選択肢があります:軽量の選択は、組み込みのpointタイプを使用し、次にCREATE EXTENSION earthdistanceを使用することです。 <@>演算子を(lon、lat)単位の2つの点で使用すると、法定距離で距離が与えられます。代わりに、はるかに強力なPostGIS拡張機能をCREATE EXTENSION postgisとともに使用してから、経度と緯度にgeographyタイプを使用することができます。私はここで最初のオプションを使用します。最も簡単で多分あなたのために十分でしょう。したがって、経度と緯度の代わりにloc pointという列を使用します。

クエリは、次になる:

SELECT g2.*, g1.loc <@> g2.loc AS distance, i.interests 
FROM goals g1 -- the traveler 
JOIN goals g2 -- the soul mate 
    ON (g2.loc <@> g1.loc) <= [[maximum distance in miles]] 
AND g2.dates && g1.dates -- dates must overlap (possibly partially) 
AND (g2.gender = 3 OR g2.gender = [[gender of user]]) 
JOIN (
    SELECT goal_id, array_agg(user_interest__id) AS interests 
    FROM goal_interests 
    WHERE user_interest__id IN (3, 4, 6) -- or whatever your interest are 
    GROUP BY goal_id 
) i ON i.goal_id = g2.id; 

このクエリあなたのすべてgoalテーブルから照合データ、各試合の行、並びに一致までの距離と共通の利益を与えると。

+0

これは他の旅行者を見つけようと多くの出会いを探している旅行者のためのものです。 – Ehask

0

これを試してみてください:

select 
    g.user_id 
from 
    goals g 
join 
    goal_interests gi on g.id = gi.goal_id 
where 
    g.location = 'Tampa FL US' and 
    g.fromdate >= '2016-08-18' and 
    g.todate <= '2016-09-18' and 
    g.gender in (1,2) and 
    gi.user_interest__id in (3,4,6) 
+0

'SELECT * FROM user_goal_interest ugi LEFT JOINの目標g ON ugi.goal_id = g._id LEFT JOIN users u ON g.user_id = u。_id WHERE 場所= 'ザファーヒルズ、フロリダ州、米国の と '2016年9月18日'> = g.fromdate と '2016年8月18日'<= g.todate と ugi.users_interest__id (132125123) とIn u.gender ( '男性'、 '女性') と IN(g.gender = 1 OR g.gender = 3) ' は、それらを表示するために、私はMySQLのために書かれたクエリは、ました私が最初に探していたもの。あなたの答えはちょうどpatrickに彼の追加のための答えを与えました – Ehask

関連する問題