使用MAX和COUNT从3个不同的表格中生成报告?

时间:2011-12-01 23:58:46

标签: mysql correlated-subquery

我有一个患者,医生,橱柜和探访的数据库。

患者( id_pac ,FirstName,LastName)

医生( id_med ,FirstName,LastName,Specialty)

机柜( id_cab ,名称)

Vizits(id_viz,Date_viz, Medic_id,Patient_id,Cabinet_id

一位医生可以在不同的病房,不同的日期对不同的病人进行探访。

我需要在一份报告中找出(使用子查询或使用连接?,但不能找到中间表或视图):

  1. 一栏中医生的完整名称:CONCAT(FirstName,'',姓氏)( DISTINCT ),
  2. 一栏医生访问次数最多的内阁名称 和 3.包含此内阁访问次数的一栏。
  3. 我试图找出如何获得这些信息,但我能拥有的只是 他访问的每个橱柜的医生名单,总访问次数/内阁:((

2 个答案:

答案 0 :(得分:1)

SELECT CONCAT(d.FirstName,' ',d.LastName) AS CompleteName
     , c.Name                             AS CabinetName  
     , dv.MaxVisits                       AS MaxVisits
FROM Doctors AS d
  LEFT JOIN
    ( SELECT Medic_id
           , MAX(NumVisits) AS MaxVisits
      FROM
        ( SELECT Medic_id
               , Cabinet_id
               , COUNT(*) AS NumVisits
          FROM Vizits AS v
          GROUP BY Medic_id
                 , Cabinet_id
        ) AS grp
      GROUP BY Medic_id
    ) AS dv
    ON dv.Medic_id = d.id_med
  LEFT JOIN
    ( SELECT Medic_id
           , Cabinet_id
           , COUNT(*) AS NumVisits
      FROM Vizits AS v
      GROUP BY Medic_id
             , Cabinet_id
    ) AS mcv
    ON  mcv.Medic_id = dv.Medic_id
    AND mcv.NumVisits = dv.MaxVisits
  LEFT JOIN Cabinets AS c
      ON c.id_cab = mcv.Cabinet_id

答案 1 :(得分:0)

我试图更好地理解这个子查询,我找到了另一种方式(我相信一个简单的方法)。代码是:

SELECT
CONCAT(me.Nume,' ',me.Prenume) AS Medic,
x.Denumire,
MAX(x.nrviz) AS maxviz
FROM (
        SELECT DISTINCT
            v.Medic_id,
            c.Denumire,
            COUNT(v.id_viz) AS nrviz
        FROM
            vizite v
        LEFT JOIN
            cabinete c
        ON(v.Cabinet_id=c.id_cab)
        GROUP BY
            v.Medic_id,
            v.Cabinet_id
        ORDER BY
            nrviz DESC) as x
LEFT JOIN
 medici me
ON (x.Medic_id=me.id_med)
LEFT JOIN
 cabinete ca
ON (x.Denumire=ca.Denumire)
GROUP BY
Medic
ORDER BY
    Medic,  
    maxviz DESC

@ypercube:如果你看到一些不同之处,请告诉我,因为看看我是忘了还是逃避了什么很重要。