2017-07-03 93 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

括号不平衡^^。为什么你将默认值默认为北美? –