where子句在同一个表上有多个条件

时间:2014-06-23 20:39:50

标签: mysql

我搜索了这个主题,发现了很多主题,但很抱歉,我找不到解决方案/想法。

我有一张表格如下

姓名|技术
Res1 |爪哇 Res1 | MySQL
Res2 |爪哇 Res3 |爪哇 Res3 | PHP
Res3 | MySQL
Res4 | MySQL
Res4 | PHP
等等..


我想建立一个关系表为

姓名|相似资源
Res1 | RES3
Res2 | Res1,Res3
Res3 |空
Res4 | RES3

了解池中可用的类似资源。我试图用光标创建存储过程,但无法继续。
我正在努力建立的步骤,
1.对于表中的每个资源,找到他们熟悉的技术列表
2.使用结果,搜索表格,找到所有具有相同技术的资源。
我尝试使用IN并导致昂贵的查询。
请建议一个更好的方法。

2 个答案:

答案 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 

Demo

答案 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; (或者你的样本数据缺少某些行,或者我误解了这个问题)。