2017-07-03 4 views
0

現在、カテゴリ/国/地域に基づいて医師に異なるページを表示しているコンテンツターゲット機能に取り組んでいます。だからここ複数の列の値に基づいて最も特定の行の一致を選択する

page_id | target_region | target_countries | target_categories 
---------+---------------+------------------+------------------- 
     1 | APAC   | null    | null 
     2 | APAC   | JP    | null 
     3 | APAC   | JP    | GP 
     4 | null   | null    | null 

ページ4がデフォルトのページで、私たちのドクターテーブルがどのように見えるかここで、

id | name | age | region | country | doctor_category 
----+--------+-----+--------+---------+----------------- 
    1 | Deepak | 25 | APAC | JP  | GP 
    2 | Anil | 25 | APAC | JP  | null 
    3 | Ajay | 27 | APAC | IN  | null 
    4 | Amit | 28 | NA  | CN  | null 

すべての私達のページ

が動的に生成される、あるページテーブルがどのように見えるかです条件が一致しない場合

期待される出力:(ベスト・マッチ)

User(1) => Page(3)

User(2) => Page(2)

User(3) => Page(1)

User(4) => Page(4)

私はposgresqlでCASE/GROUP BY/ DISTINCT ONで多くのことを試したが、1つ以上のシナリオのための成功、その失敗。私はハードコアのデータベースの男ではないので、私は同じ機能を達成するためにいくつかのビルドされた機能が不足している可能性があります。

ご意見をいただければ幸いです。 PostgreSQLではだけで働く、あなたのロジック

+2

なぜユーザー4は、地域が北米である一方、地域がヌルのページを表示していますか? –

+2

mysqlとpostgresqlは2つの異なる製品です。無関係のタグを削除してください。 –

+0

と同様に、ページ1には国が関連付けられておらず、ユーザー3には国「IN」が指定されているのはなぜですか? –

答えて

2

別のソリューションによって異なり

+0

あなたの質問をチェックします。何も見つからない場合、ページはすべてnull値になります –

+0

この優先順位に従ってクエリを更新します。ヌル値のページは常に「受け入れ可能」なページになりますので、デフォルトでこのページに戻ります: –

+0

ユーザー3と4では、ページは選択されません。 –

0

この

select d.*, p.Page_Id 
from Doctors as d left join PageTable as p 
on (d.Region = COALESCE(p.target_region,'NULL') 
    and COALESCE(d.Country,'NULL') = COALESCE(p.targer_countries,'NULL') 
    and COALESCE(d.Doctor_Category,'NULL') = COALESCE(p.targer_categories,'NULL')) 

または第二wicheが明らかに最初のマッチ行

select d.*, (select Page_Id from PageTabl as p where d.Region = COALESCE(p.target_region,'NULL') 
    and COALESCE(d.Country,'NULL') = COALESCE(p.targer_countries,'NULL') 
    and COALESCE(d.Doctor_Category,'NULL') = COALESCE(p.targer_categories,'NULL') 
    LIMIT 1) as Page_Id 
from Doctors as d 

を取得してみてください、あなたは合体を変更することができます。

SELECT DISTINCT 
    id, 
    first_value(page_id) OVER (
    PARTITION BY id 
    ORDER BY target_categories IS NULL, target_countries IS NULL, target_region IS NULL 
) 
FROM doctors 
    LEFT JOIN pages ON (target_categories = doctor_category OR target_categories IS NULL) 
    AND (target_countries = country OR target_countries IS NULL) 
    AND (target_region = region OR target_region is null); 

問題は厳密には明確ではないことに注意してください。ページが国と一致しているがカテゴリがなく、カテゴリーに一致するが国がないように、どのページを選択するかは不明です。

タイは、どのパラメータが最も優先度が高いかを選択することによって壊れます。これはORDER BY行の仕事です。最初の列の優先順位が最も高くなります。それらが発生する順序を自由に変更してください。

それ以外の場合、クエリは次のように動作します:

  • 各医師
  • 精度によって医師
  • 注文それらをするために許容されるすべてのページが各医師
  • のための最初の値のみを選択して選択します
  • クエリは許容可能なページごとに1つの(同一の)行を生成するため、DISTINCTを使用して繰り返し行をドロップします。
+0

これは動作しません。 –

+0

なぜ動作しませんか? – Vecchiasignora

+0

カッコはバランスが取れていません^^。北米へのヌル値のデフォルト設定はどうしてですか? –

関連する問題