2017-07-03 96 views
0

我目前正在研究內容定位功能,我們正在根據他們的類別/國家/地區向醫生顯示不同的頁面。根據多個列值選擇最具體的行匹配

因此,這裏是我們的醫生表的樣子,

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 

我們所有的頁面是動態生成的,這是我們的頁表的樣子,

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頁是默認頁面如果沒有條件匹配

預期輸出:(最佳特定匹配)

User(1) => Page(3)

User(2) => Page(2)

User(3) => Page(1)

User(4) => Page(4)

我嘗試了很多與posgresql CASE/GROUP BY/ DISTINCT ON,但沒有成功,對一個或多個方案的失敗。我不是一個硬核數據庫的人,所以我可能會缺少一些構建的功能來實現相同的功能。

任何建議將不勝感激。

+2

爲什麼用戶4在地區爲北美的情況下顯示的地區爲null的頁面? –

+2

mysql和postgresql是兩種不同的產品。請刪除不相關的標籤。 –

+0

同樣,爲什麼頁面1沒有國家關聯,而用戶3的國家「IN」指定? –

回答

2

另一種解決方案,只有在PostgreSQL的工作:

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系列的工作。第一列的優先級最高。隨意改變它們發生的順序。

否則查詢是這樣的:

  • 選擇所有都是可以接受的醫生
  • 令他們的準確性每個醫生
  • 只選擇每個醫生的第一個值的網頁
  • 由於查詢會在每個可接受的頁面上產生一個(相同)行,因此我們使用DISTINCT刪除重複的行。
+0

將檢查您的查詢,優先順序是類別>國家>地區。如果什麼都沒有發現獲取頁面將全部爲空值 –

+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 

,你可以改變聚結取決於你的邏輯

+0

這不起作用。 –

+0

爲什麼它不起作用? – Vecchiasignora

+0

括號不平衡^^。爲什麼你將默認值默認爲北美? –