如何仅显示一列中唯一值的数量等于第二列中的值的行

时间:2018-03-19 16:43:42

标签: mysql sql

(使用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    

我花了很多时间试图解决这个问题。如果有人热衷于帮助我,我可以将数据库发送给您。感谢。

1 个答案:

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