(使用mysql 5.0)
我有这张桌子:
opportunity main_user_id certificate_id required_certificates
1 491 1 2
1 341 1 2
1 161 1 2
1 161 2 2
1 205 2 2
1 578 2 2
2 161 2 2
2 466 3 2
2 466 2 2
2 156 2 2
2 668 2 2
3 222 5 1
3 123 5 1
3 875 5 1
3 348 5 1
我只需显示certificate_id
中不同值的数量等于required_certificates
中的值的行。
opportunity_id
列的ID为0到15且main_user_id
重复(因此我无法使用group by
)
该表基本上是针对具有所需证书的特定工作机会匹配的用户列表。我现在需要做的就是只显示拥有所需证书的人,而不是一个或另一个。
我当前的sql语句:
select op_main.id as opportunity_id, u.id as main_user_id, c.id as certificate_id, required2.required as required_certificates
from opportunities as op_main
join opportunity_certificates as oc on oc.opportunity_id = op_main.id
join certificates as c on c.id = oc.certificate_id and oc.is_required
join user_certificates as uc on uc.certificate_id = c.id
join users as u on u.id = uc.user_id
join (
select id as op_id, (
select count(distinct c.id)
from opportunities as op
join opportunity_certificates as oc on oc.opportunity_id = op.id
join certificates as c on c.id = oc.certificate_id and oc.is_required
join user_certificates as uc on uc.certificate_id = c.id
join users as u on u.id = uc.user_id
where uc.certificate_id = oc.certificate_id and oc.is_required and op.id = op_id
) as required from opportunities
) as required2 on required2.op_id = op_main.id
where uc.certificate_id = oc.certificate_id and oc.is_required and op_id = op_main.id
基于上表,输出将为:
opportunity main_user_id
1 161
2 466
3 222
3 123
3 875
3 348
我花了很多时间试图解决这个问题。如果有人热衷于帮助我,我可以将数据库发送给您。感谢。
答案 0 :(得分:0)
使用windowed functions - MySQL 8 and above非常简单:
WITH cte AS (
SELECT *, COUNT(DISTINCT certificate_id) OVER(PARTITION BY user_id) AS cnt
FROM (
-- your query with joins
) sub
)
SELECT *
FROM cte
WHERE cnt = required_certificates;
<强> DBFiddle Demo 强>
事实证明MySQL 8.0
不支持COUNT(DISTINCT ...) OVER
所以我将子查询与DISTINCT
一起使用。
ER_NOT_SUPPORTED_YET:这个版本的MySQL还没有支持&#39;(DISTINCT ..)&#39;