我搜索了这个主题,发现了很多主题,但很抱歉,我找不到解决方案/想法。
我有一张表格如下
姓名|技术
Res1 |爪哇
Res1 | MySQL
Res2 |爪哇
Res3 |爪哇
Res3 | PHP
Res3 | MySQL
Res4 | MySQL
Res4 | PHP
等等..
我想建立一个关系表为
姓名|相似资源
Res1 | RES3
Res2 | Res1,Res3
Res3 |空
Res4 | RES3
了解池中可用的类似资源。我试图用光标创建存储过程,但无法继续。
我正在努力建立的步骤,
1.对于表中的每个资源,找到他们熟悉的技术列表
2.使用结果,搜索表格,找到所有具有相同技术的资源。
我尝试使用IN并导致昂贵的查询。
请建议一个更好的方法。
答案 0 :(得分:2)
为了满足类似资源必须具备所有匹配技术的要求,您可以使用内联视图比较匹配技术的计数
SELECT counts.name,
Group_concat(matchCount.name) simliarName
FROM (SELECT name,
Count(technology) techCount
FROM table1
GROUP BY name) counts
LEFT JOIN (SELECT t1.name t1_name,
t2.name,
Count(t2.technology) matchingTech
FROM table1 t1
JOIN table1 t2
ON t1.technology = t2.technology
AND t1.name != t2.name
GROUP BY t1.name,
t2.name) matchCount
ON counts.name = matchcount.t1_name
AND counts.techcount <= matchCount.matchingtech
GROUP BY counts.name
答案 1 :(得分:0)
将表连接到自身并使用group_concat函数创建列表:
select x.name, group_concat(distinct y.name2) as similarResource
from (select name, count(*) c from mytable group by 1) x
join (select t.name, s.name name2, count(*) c
from mytable t
join mytable s on t.technology = s.technology
and t.name != s.name
group by 1, 2) y on x.name = y.name
where y.c >= x.c
group by 1
请参阅live demo,使用您的示例数据输出以下内容:
NAME SIMILARRESOURCE
Res1 Res3
Res2 Res1,Res3
Res4 Res3
请注意,此查询的输出不包含Res3 | Res4
,因为Res4没有&#34; java&#34; (或者你的样本数据缺少某些行,或者我误解了这个问题)。