MySQL查询和子查询不熟练

时间:2017-12-21 07:09:18

标签: mysql subquery

我有4张桌子:

  1. entrevista
    • id_entrevista PK
    • candidato FK candidato(#id_candidato)
    • proceso FK proceso(#id_proceso)
    • resultado
  2. candidato
    • id_candidato PK
  3. proceso
    • id_proceso PK
    • dpt FK DPT(#id_dpt)
  4. DPT
    • id_dpt PK
  5. 我需要在我的查询中搜索每个'DPT',显示每个'proceso'的'id_entrevista'计数,但是entrevista.resultado = 1并且必须是每个entrevista.candidato的最后一行

    但如果我有更多行相同的entrevista.candidato:

    只是现在我可以拿到entrevista.id_entrevista的数量(计数):

    SELECT p.id_proceso,
        (
                SELECT count(id_entrevista)
                from entrevista
                where entrevista.proceso = p.id_proceso
            ) as total
    from proceso p
    where dpt = 99   //this is the current dpt
    

    但是我需要子查询:

    SELECT p.id_proceso,
            (
                    SELECT count(id_entrevista)
                    from entrevista
                    where entrevista.proceso = p.id_proceso
                ) as total,
           (
            //here
             ) as approved
        from proceso p
        where dpt = 99   //this is the current dpt
    

    我有一个想法,我需要检查entrevista中每个candidato的最后proceso。像这样:

    SELECT *
     FROM  entrevista
     WHERE proceso = 120 and candidato = 374
     ORDER BY fecha_entrevista DESC LIMIT 1
    

    这将给我resultado,结果为1或0。我只需要count从查询中返回1的行

    例如:

    |entrevista |
     -----------
     0001 | 0001 | 0001 | 20-12-2017 | 1
     0002 | 0001 | 0001 | 21-12-2017 | 0
     0003 | 0002 | 0001 | 20-12-2017 | 1
     0004 | 0003 | 0001 | 20-12-2017 | 1
    
     | candidato |
     ----------
     0001 | Foo 
     0002 | Bar
     0003 | John Doe
    
     |proceso |
     ----------
     0001 | FooProceso | 0001
    
     | DPT |
     ----
     0001 | FooDPT
    

    预期产出:

     Proceso    | Amount of interviews | Amount of pass
     --------------------------------------------------
     FooProceso | 4                    | 2
    

1 个答案:

答案 0 :(得分:1)

感谢您的帮助,最后我做到了:

SELECT p.id_proceso, p.proceso,
                               (
                                SELECT count(id_entrevista)                                                                 
                                from entrevista                                                                 
                                where entrevista.proceso = p.id_proceso                                                             
                               ) as q_entrevistas,                                                              
                             (
                                select count(distinct(ee.candidato))                                                                    
                                from entrevista ee                                                                  
                                where ee.proceso = p.id_proceso                                                                 
                                and ee.candidato not in (                                                                                                   
                                                          select e.candidato                                                                                                    
                                                          from entrevista e                                                                                                 
                                                          where e.proceso = p.id_proceso and e.resultado = 0
                                                        )
                            ) as aptos
FROM proceso p
WHERE p.dpt = $dpt //in this case i use PHP