使用MySQL

时间:2015-05-25 11:08:25

标签: php mysql sql json highcharts

有两张桌子。 第一张表格显示了一名护士下的孕妇人数。请记住,有很多护士来自一位医生。每个孕妇都映射到一名护士,每名护士都映射到一名医生。层次结构是

孕妇 - > 护士 - > 医生

现在,每个孕妇都有注册日期。

第二张表显示了护士与医生的对应关系。

现在,我的查询应该按月(1月至12月)为每位医生提取医生的详细信息和孕妇登记点的数量。所以我的最终结果应该是JSON格式,如下所示。我需要这种格式用于HighCharts。

如果某个月没有孕妇,则应该返回0

[{
        name: 'Doctor ID',
        data: [7.0(Jan), 6.9(Feb), 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3,   13.9, 9.6(Dec)],

       name: 'Doctor ID 2',
        data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]
    }, {
        name: 'Doctor Id 3',
         data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
    }]

我尝试了以下查询,但在涉及到月份时,我无法创建结构。

SELECT preg_reg_other.preg_id,nurse_dets.doctor_id,preg_reg_other.reg_date
from preg_reg_other,nurse_dets
where preg_reg_other.nurse_id = nurse_dets.nurse_id
and preg_reg_other.reg_date is not null
and nurse_dets.doctor_id= 1031
order by preg_reg_other.reg_date asc

修改

这两个表如下

表1:nurse_dets

nurse_id  population  doctor_id nurse_name

表2:preg_reg_other

preg_id  nurse_id  reg_date  

1 个答案:

答案 0 :(得分:2)

我会这样做:

每位医生都会这样做一个查询:

/* get all pregrant women for a doctor, group by month and count records */
SELECT MONTH( p.reg_date ), COUNT(*) 
FROM nurse_dets n
INNER JOIN preg_reg_other p 
    ON n.nurse_id = p.nurse_id 
WHERE n.doctor_id = 1301
AND n.reg_date IS NOT NULL
GROUP BY MONTH( p.reg_date )
ORDER BY p.reg_date ASC

这将为您提供每月与医生相关的孕妇数量(ID为1301)

现在,您可以为每位医生进行这样的查询,并且在每次迭代中为您制作不同的系列图表

最后,您将所有系列数组传递给客户端并获取highcharts的数据

修改

在没有孕妇的月份获得0的值是一个更复杂的事情,因为如果没有至少一个记录可以计算,则该组不会返回任何值。试试这个:

SELECT months.num, COUNT( p.preg_id )
FROM 
   ( SELECT 1 AS num
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     UNION ALL SELECT 5  
     UNION ALL SELECT 6 
     UNION ALL SELECT 7  
     UNION ALL SELECT 8 
     UNION ALL SELECT 9  
     UNION ALL SELECT 10
     UNION ALL SELECT 11  
     UNION ALL SELECT 12 ) months
LEFT JOIN preg_reg_other p 
    ON months.num = MONTH ( p.reg_date )
INNER JOIN nurse_dets n
    ON n.nurse_id = p.nurse_id
WHERE n.doctor_id = 1301    
GROUP BY MONTH( months.num )
ORDER BY months.num ASC

首先我们手动构建一个包含12个月和"左连接"与其他表格一样,如果没有任何记录,最终的计数应该为0

我还没有测试过这个问题,但我希望你能得到这个想法