Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL变量限制和子查询_Mysql_Variables_Subquery - Fatal编程技术网

MYSQL变量限制和子查询

MYSQL变量限制和子查询,mysql,variables,subquery,Mysql,Variables,Subquery,我对mysql版本14.14发行版5.5.35上的mysql查询有一个问题: 我有一个名为mytable的表,有3列date、value和id\u patient 对于每一行,我需要知道前4个值的总和不为null SELECT @date:=date, value, ( SELECT SUM(value) FROM mytable WHERE date<@date AND id_patient=87321 AND value

我对mysql版本14.14发行版5.5.35上的mysql查询有一个问题:

我有一个名为mytable的表,有3列date、value和id\u patient

对于每一行,我需要知道前4个值的总和不为null

SELECT @date:=date, value, 

(     SELECT SUM(value)
      FROM mytable 
      WHERE date<@date 
      AND id_patient=87321 
      AND value IS NOT NULL 
      ORDER BY date DESC LIMIT 0,4 ) somme  

FROM mytable 
WHERE id_patient=87321 
感谢您的帮助:

在限制结果之前,所有行上的总和都已发生。在使用另一个子查询应用sum函数之前,首先限制结果


通过自连接和聚合:

select m.date, m.id_patient, m.value,
  sum(mm.value) somme
from mytable m left join mytable mm
on mm.id_patient = m.id_patient and mm.value is not null and mm.date < m.date 
and (
  select count(*) from mytable
  where id_patient = m.id_patient and value is not null 
  and date >= mm.date and date < m.date 
) <= 4
where m.id_patient = '87321'
group by m.date, m.id_patient, m.value

谢谢你的回答。不幸的是,我已经尝试过了,但子查询中的日期变量似乎没有改变,因为我对每一行都有相同的结果…@FranckBarlet,我认为您试图用相同的总和值显示这4天,请尝试更新的答案否,结果不是等待结果。。。它只返回4行相同的总和。。。这个查询会杀了我:信息:我在帖子中添加了等待结果示例。我认为子请求是首先执行的。因此@date变量此时没有任何值…请参阅:。另外,我不熟悉“等待结果”这个词。谢谢你的评论。我已经编辑了我的帖子,并更改了术语“等待结果”。对不起,我的英语不好。。。我希望会好些。一定要在最后几天吗?只有4天,还是最近?总的目标是什么?只有4个。如果一个患者的就诊间隔几天,那么4天的确认时间是多少?您的MySql版本是什么?我需要将当天的值与值之和进行比较​​前4天的一个非零值。例如:我将2019-11-28的值与2019-11-27和2019-11-24 4天之间的值之和进行比较,因为每个值都不为空。但是对于2019-11-25,我取2019-11-19 6天之间的值,因为我有2个空值,我希望我的解释很清楚。非常感谢您提供此解决方案。这是一个伟大的方式去!
+-------------+--------------------+--------+
| @date:=date | value              | somme  |
+-------------+--------------------+--------+
| 2019-11-17  |                  6 |   NULL | SUM OF 0 previous values not null
| 2019-11-18  |                  1 |      6 | SUM OF 1 previous values not null
| 2019-11-19  |                  2 |      7 | SUM OF 2 previous values not null
| 2019-11-20  |               NULL |      9 | SUM OF 3 previous values not null
| 2019-11-21  |                  5 |      9 | SUM OF 4 previous values not null
| 2019-11-22  |                  8 |     14 | SUM OF 4 previous values not null
| 2019-11-23  |               NULL |     16 | SUM OF 4 previous values not null
| 2019-11-24  |                  3 |     16 | SUM OF 4 previous values not null
| 2019-11-25  |                  4 |     18 | SUM OF 4 previous values not null
| 2019-11-26  |                  6 |     20 | SUM OF 4 previous values not null
| 2019-11-27  |                  1 |     21 | SUM OF 4 previous values not null
| 2019-11-28  |                 10 |     14 | SUM OF 4 previous values not null
+-------------+--------------------+--------+
SELECT @date:=date, value, 
    (SELECT sum(value) from 
        (SELECT value
          FROM mytable 
          WHERE date<@date 
          AND id_patient=87321 
          AND value IS NOT NULL 
          ORDER BY date DESC LIMIT 0,4))
FROM mytable 
WHERE date<@date 
    AND id_patient=87321 
    AND value IS NOT NULL 
ORDER BY date DESC LIMIT 0,4
select m.date, m.id_patient, m.value,
  sum(mm.value) somme
from mytable m left join mytable mm
on mm.id_patient = m.id_patient and mm.value is not null and mm.date < m.date 
and (
  select count(*) from mytable
  where id_patient = m.id_patient and value is not null 
  and date >= mm.date and date < m.date 
) <= 4
where m.id_patient = '87321'
group by m.date, m.id_patient, m.value
| date       | id_patient | value | somme |
| ---------- | ---------- | ----- | ----- |
| 2019-11-17 | 87321      | 6     |       |
| 2019-11-18 | 87321      | 1     | 6     |
| 2019-11-19 | 87321      | 2     | 7     |
| 2019-11-20 | 87321      |       | 9     |
| 2019-11-21 | 87321      | 5     | 9     |
| 2019-11-22 | 87321      | 8     | 14    |
| 2019-11-23 | 87321      |       | 16    |
| 2019-11-24 | 87321      | 3     | 16    |
| 2019-11-25 | 87321      | 4     | 18    |
| 2019-11-26 | 87321      | 6     | 20    |
| 2019-11-27 | 87321      | 1     | 21    |
| 2019-11-28 | 87321      | 10    | 14    |