2013-08-16 47 views
-1

我正在寻找一种匹配行b/w两个表的方法。跨表匹配行

name_tokens 
----------------- 
product_id, tokens 
---------------- 
1, token 1 
1, token 2 
1, token 3 
2, token 1 
2, token 2 
3, token 1 
4, token 1 

----------- 
models_tokens 
--------------- 
product_id, tokens 
------------------ 
1, token 1 
1, token 2 
2, token 1 
3, token 1 
4, token 1 

因此,基本上一个表包含产品的模型标记,另一个表包含产品的名称标记。我想获得所有名称标记都包含所有模型标记的产品。

它会这样。 1.)对于每个产品,请查看产品有多少型号令牌 2.)检查该产品的每个型号令牌是否存在名称令牌。如果是,则计数匹配。

我希望我可以清楚地描述这个场景。如果不是,我会对这个问题提出任何要求。

编辑

--------- 
name_tokens 
----------------- 
product_id, tokens 
---------------- 
1, hello 
1, world 
1, stackoverflow 
2, Stack 
2, overflow 
3, stack 
4, flow 

----------- 
models_tokens 
--------------- 
product_id, tokens 
------------------ 
1, hello 
1, stackoverflow 
2, ovreflow 
3, overflow 
4, stack 

所以导致我需要的是

product_id 
1 
2 
+0

在这种情况下,您想从'name_tokens'获得产品ID'1'? –

+0

@ 491243我不会用令牌1表示一个值,它只是说第一个令牌去那里。因此,对于该产品,如果令牌1和两个表上的令牌2具有相同的值,则产品ID为1。说令牌1是“你好”,令牌2是“世界” – Ankit

+0

如果仍然不清楚,请让我知道。我会用一些真实的数据 – Ankit

回答

1

你要做一个左外做加盟,聚集:

select nt.product_id 
from name_tokens nt left outer join 
    model_tokens mt 
    on nt.product_id = mt.product_id and 
     nt.tokens = mt.tokens 
group by nt.product_id 
having count(mt.product_id) = count(*); 

什么这个查询的作用是从name_tokens表开始并查找所有匹配model_tokens表。如果没有匹配,则NULL被分配给mt中的行(left outer join提供)。 having子句将返回第二个表中具有相同数量匹配的所有产品,因为第一个表中有令牌。

编辑:

对于反向,则可以反向查询:

select mt.product_id 
from model_tokens mt left outer join 
    name_tokens nt 
    on nt.product_id = mt.product_id and 
     nt.tokens = mt.tokens 
group by mt.product_id 
having count(nt.product_id) = count(*); 

注意,having条款的改变以及的加入顺序和group by条款。

+0

HI @Gordon首先非常感谢您的回答。但这似乎与我所要求的完全相反。它返回所有名称标记存在于模型标记中的产品。我需要所有型号令牌存在于名称令牌中的产品。 – Ankit

+0

我想我只需要切换表格的位置。再次感谢。 – Ankit

+0

在第二种解决方案中,它应该由mt.product_id组成吗?或者我错过了什么? – Ankit