Mysql从两个表中获取匹配项的总数

时间:2017-03-02 07:11:11

标签: mysql database

我有两张桌子,如下所示......

INSERT INTO `tbl_project_skills` (`id`, `projectId`, `skillId`) VALUES
(17, 2, 44),
(27, 2, 43),
(31, 2, 78),
(33, 142, 79),
(35, 123, 88);


INSERT INTO `tbl_user_skills` (`id`, `userId`, `skillId`) VALUES
(2, 1, 44),
(3, 1, 78),
(5, 23, 45),
(6, 1, 36),
(7, 23, 88);

我想找到用户与每个项目匹配的技能数量,如下所示

-----------------------------------------------------
userId  |  projectId  | number_of_matched_skills
-----------------------------------------------------
1       |   2         |  2
1       |   142       |  0
1       |   123       |  0
23      |   2         |  0
23      |   142       |  0
23      |   123       |  1
------------------------------------------------------

我尝试过以下解决方案......

SELECT ps.projectId, us.userId, ps.skillId AS pskillid, us.skillId AS uskillid, @points_veri:= (CASE WHEN '44' IN(ps.skillId) THEN 1 ELSE 0 END) + (CASE WHEN '43' IN(ps.skillId) THEN 1 ELSE 0 END) + (CASE WHEN '78' IN(ps.skillId) THEN 1 ELSE 0 END) AS number_of_matched_skills FROM tbl_user_skills AS us, tbl_project_skills AS ps 

但我无法做对。希望你们能给出一个提示。

2 个答案:

答案 0 :(得分:1)

我认为您可能有另一个商店用户和项目表,或者此查询需要先从userId获取tbl_user_skills,然后从projectId获取tbl_project_skills,然后再进行交叉加入,然后加入tbl_user_skillstbl_project_skills进行汇总:

select
    main.userId,
    main.projectId,
    count(ps.projectId) as number_of_matched_skills
from (
    select u.userId, p.projectId 
    from (
        select distinct projectId from tbl_project_skills
    ) p
    cross join (
        select distinct userId from tbl_user_skills
    ) u
) main
left join tbl_user_skills us on us.userId = main.userId
left join tbl_project_skills ps on ps.skillId = us.skillId and main.projectId = ps.projectId
group by main.userId, main.projectId

以下是demo中的rextester.com

答案 1 :(得分:0)

没有另一张桌子的另一种选择。在skillId上创建OUTER JOIN然后GROUP BY

SELECT userid, 
       projectid, 
       SUM(CASE WHEN p.skillId>1 AND u.skillId>1 THEN 1 ELSE 0 END) AS skills 
FROM tbl_user_skills u
FULL OUTER JOIN tbl_project_skills p
ON u.skillId = p.skillId
GROUP BY userid, projectid
ORDER BY skills DESC