我正在寻找一种方法来匹配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 :(得分: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
子句的更改。