mysql加入同一个表

mysql加入同一个表,mysql,sql,database,Mysql,Sql,Database,给定mysql中名为RECORD的表,其结构如下: rid(pk & AI) patientid(fk) recordTYPE(varchar) recordValue(varchar) recordTimestamp(timestamp) 1 1 temperature(℃) 37.2 2015-08-11 18:10:04 2 1

给定mysql中名为RECORD的表,其结构如下:

rid(pk & AI)   patientid(fk) recordTYPE(varchar)  recordValue(varchar) recordTimestamp(timestamp)
     1             1             temperature(℃)           37.2              2015-08-11 18:10:04
     2             1             weight(kg)                65.0              2015-08-11 18:20:08                    
     3             1             heartbeat(bpm)            66                2015-08-11 18:30:08
     4             1             temperature(℃)           36.8              2015-08-11 18:32:08
您可以看到,对于同一日期,一种特定类型的记录可以有多条记录。e、 g.样品数据中的温度:

   rid        patientid          recordTYPE             value              recordtimestamp
    1             1             temperature(℃)           37.2              2015-08-11 18:10:04
    4             1             temperature(℃)           36.8              2015-08-11 18:32:08
在这种情况下,我们应该选择最新的记录。i、 e.rid=4且值=36.8的记录

现在给定一个输入日期,例如“2015-8-11”,我想进行查询以获得如下信息:

   date      patientid  temperature(℃)    weight(kg)    heartbeat(bpm)
2015-08-11       1         36.8              65.0            66
2015-08-11       2         36.5              80.3            70
2015-08-11       3         35.5              90.5            80
     ..........................................................
     ..........................................................
2015-08-11       4         35.5              null            null
                                 Fig. 2
   date      patientid     recordTYPE      recordValue    
2015-08-11       1       temperature(℃)    36.8              
2015-08-11       1         weight(kg)       65.0            
2015-08-11       1        heartbeat(bpm)    66
2015-08-11       2       temperature(℃)    36.5              
2015-08-11       2         weight(kg)       80.3            
2015-08-11       2        heartbeat(bpm)    70
2015-08-11       4       temperature(℃)    35.5              
                                 Fig. 4
此外,您可以看到,对于特定日期,可能没有任何某些类型的记录。在本例中,该列中的值为null

我尝试了以下查询:

   SELECT max(recordTimestamp), patientid, recordTYPE, recordValue  
   FROM RECORD 
   WHERE date(recordTimestamp) = '2015-08-11'
   GROUP BY patientid, recordTYPE
结果是:

   date      patientid  temperature(℃)    weight(kg)    heartbeat(bpm)
2015-08-11       1         36.8              65.0            66
2015-08-11       2         36.5              80.3            70
2015-08-11       3         35.5              90.5            80
     ..........................................................
     ..........................................................
2015-08-11       4         35.5              null            null
                                 Fig. 2
   date      patientid     recordTYPE      recordValue    
2015-08-11       1       temperature(℃)    36.8              
2015-08-11       1         weight(kg)       65.0            
2015-08-11       1        heartbeat(bpm)    66
2015-08-11       2       temperature(℃)    36.5              
2015-08-11       2         weight(kg)       80.3            
2015-08-11       2        heartbeat(bpm)    70
2015-08-11       4       temperature(℃)    35.5              
                                 Fig. 4
问题是:

  • 给定这个表记录,正确的mysql语句是什么 性能(如检索速度)以生成所需的结果集(即图2)

  • 如果数据库设计发生改变,是否会更好(在方便查询和增加新记录类型等可伸缩性方面)? e、 g.为每种类型的记录创建一个表,而不是将所有类型的记录放在一个表中

  • 由于我是db新手,任何建议都非常感谢。。。。。。多谢各位

    您可以尝试以下方法:-

    SELECT MAX(rid), patientid, recordTYPE, MAX(recordValue), recordTimestamp
    FROM YOUR_TABLE
    WHERE recordTimestamp = '2015/08/11'
    GROUP BY patientid, recordTYPE, recordTimestamp;
    

    这里有一个方法

    不幸的是,MySQL不支持
    row_number()over(partition by…)
    语法,这将大大简化这一过程。 相反,我过度使用了这里讨论的一个技巧:


    细分

    这表示如果这是当前分组的partientId/date组合的最后一天温度,则返回它;否则返回null。然后,它获取匹配值的最大值(除了1之外,其他所有值都为空,这就给出了我们要查找的值)

    tRank=1
    如何表示patientId/日期组合的一天中的最后一个温度将在后面解释

    该行表示,如果该记录的patientId和日期与上一条记录相同,则将
    x
    设置为1;如果是新组合,则将其设置为0

    select case when @p = `patientId` and @d = cast(`recordTimestamp` as date) then @x := 1 else @x := 0 end
    
    下一行表示,如果我们有一个新的patiendIt/date组合,请重置
    t
    w
    h
    标记,表示“您收到的下一个值将是我们要查找的值”

    下一行按记录类型拆分数据;如果此记录不是他们的记录类型,则返回null,或者返回一个数字,说明我们现在看到的patientId/date组合中的此类记录的数量

    , case `recordType` when 'temperature(℃)' then case @x when 1 then @t := @t + 1 else @t := 1 end else null end as `tRank`    
    
    这与上述类似;除了返回组合计数器之外,它还返回当前记录的值(如果这是不同的记录类型,则返回null)

    然后记录当前记录的日期和patientId值,以便在下一次迭代中将它们与下一个记录进行比较

    , @d := cast(`recordTimestamp` as date) as `date`
    , @p := `patientId` as `patientId`
    
    交叉连接和下面的子查询仅用于初始化变量

    (第一个)
    orderby
    用于确保比较当前和以前的记录足以判断我们是否在寻找不同的组合(即,如果所有组合都分组,那么任何更改都很容易发现;如果组合保持交替,我们需要跟踪我们以前看到的每个组合)。
    recordTimestamp
    按降序排序,这样我们在新组合上看到的第一条记录将是当天的最后一条记录;我们要找的那个

    , max(case when `tRank`=1 then `temperature(℃)` else null end) 
    
    , case when @x = 0 then @t := 0 end
    

    groupby
    用于确保每个组合得到1个结果;最后一个
    排序,只是为了使输出有序。

    结构正常;这实际上取决于表将如何使用(数据将如何进入其中,将对其运行什么查询,它是否与其他表中的数据链接,等等);所以不能肯定这是最好的解决方案,但没有警钟<代码>记录类型
    最好替换为引用不同表的外键;这样可以减少每行的大小并提高可维护性。谢谢,但此查询不会产生预期结果