我有问题,我知道如何处理多个查询,但现在不是
我有一张
的桌子 BP {
name: varchar
systolic : int
diastolic : int
timestamp: date
}
我需要从BP表中获取满足以下 ANY 条件的名称。
systolic > 180 OR diastolic > 110
(systolic >= 140 AND systolic < 180)
,则接下来的2个收缩压读数,得到平均值,如果该平均值> = 140.那么条件满意。(diastolic >= 90 AND systolic < 110)
,则接下来的2个舒张压读数,得到平均值,如果该平均值> = 90.那么条件满意。name
。 (意味着每人的BP记录很多)。如果我获取所有值并在PHP中自己解析它,我当然可以得到这个工作。
但我想知道是否有更好的方法直接在MySQL中进行。
我的目标是找到患有高血压的人。并且这些条件高于指南将人归类为高血压。
在这个例子中,我简化了表格。而且我希望获得满足这些高血压指南的那些name(s)
。
条件1解决起来非常简单。条件2&amp; 3是什么麻烦我。现在,我只需获取systolic >=140 AND systolic < 180
的人员列表,根据名称对其进行过滤,按时间戳排序,并通过每个集合进行枚举,如果找到systolic >= 140 AND systolic < 180
,则打破枚举并检查接下来读取该名称的2个读数并取平均值。
我用舒张压重复一遍。并将结果与所有三个条件合并,删除任何重复的条目。
这就是我目前所做的。
答案 0 :(得分:0)
是的,它可以在MySQL中完成。我认为它甚至可以作为SELECT语句来做(但这将非常复杂,难以维护并且可能非常慢)。
由于您目前还不确定是否可以在MySQL中进行此操作,并且在此处提问,我建议在PHP中实施解决方案可能会更好地利用您的时间 - 您可以剪切和粘贴代码答案,这可能会给出正确的结果,但您是否能够评估解决方案的细微差别?你能在破裂时修好它吗?升级它以适应新功能?
如果是我,我会使用MySQL程序将其实现为finite state machine(实际上是3个FSM,每个条件一个)。在条件满足时你没有说出你应该做什么 - 但是如果你只是在数据库中记录这个事实,你可以用简单的SQL语句做任何你喜欢的事情。这种方法的另一个优点是,您不需要在每次要应用条件时重新计算所有数据。
我将描述应用条件2的过程。所有3个条件(以及更多条件)可以在数据的单次传递中实现。第一个可以通过简单的选择来完成。
1) select the data which has not been previously processed, ordered by name, then timestamp
in a loop:
2.1) if the name is different from the last stored value, reset s1 and s2
2.2) if (systolic >= 140 AND systolic < 180)
2.2.1) if s1 is set
2.2.1.1 if s2 is set
caclulate average if over limit, flag record, reset systolic1 and systolic2
2.2.1.2 else
set s2 to current systolic pressure
2.2.2) else
set s1 to current systolic pressure
2.3) else
reset s1 and s2
repeat for all records