大家好,这是一个MySQL问题,它使用2个表联接的结果,有条件地评估它们并输出2个值。
这是数据库结构。
第一表gtpro包含
用户ID(列名ID)
样本/年数,即每年2、4或12次(列名labSamples__yr)
第二表结果包含
相同的用户ID(列名idgtpro)
样本日期的日期列(提供样本时)列名称日期
因此此查询返回所有ID的概述,以及该ID的最后一次提交样品的时间。
SELECT a.id, a.labSamples__yr, max(b.date) as ndate from gtpro as a
join labresults as b on a.id = b.idgtpro group by a.id
我要评估的条件看起来像这样。
a.labSamples__yr = 2 and ndate >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
a.labSamples__yr = 4 and ndate >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)
a.labSamples__yr = 12 and ndate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
因此,如果每年的样本数量为2,并且上次采样日期是6个月前,则我想知道该ID的样本ID和样本的最新日期。
我尝试使用CASE和IF语句,但不能完全正确。这是我的最新尝试。
select id, ndate,
case when (labSamples__yr = 2 and ndate <= DATE_SUB(CURDATE(), INTERVAL 6 MONTH))is true
then
(SELECT id from gtpro as a join labresults as b on a.id = b.idgtpro where
labSamples__yr = 2 and max(b.date) <= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)) end as id
from (SELECT a.id, a.labSamples__yr, max(b.date) as ndate from gtpro as a
join labresults as b on a.id = b.idgtpro group by a.id) d
这告诉我无效使用组功能。
迫切需要一点帮助
编辑我弄乱了我现在已修复的代码中的一些名称。
最佳答案
如果我正确理解了您的问题,则应该可以将条件放在where
子句中:
SELECT a.id, a.labSamples__yr, max(b.date) as ndate
from gtpro a join
labresults b
on a.id = b.idgtpro
where (a.labSamples__yr = 2 and b.date >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)) or
(a.labSamples__yr = 4 and b.date >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)) or
(a.labSamples__yr = 12 and b.date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
group by a.id;
可以解决您的语法问题。但是,如果您希望
id
具有最大日期,请尝试执行以下操作:select a.labSamples__yr, max(b.date) as ndate,
substring_index(group_concat(a.id order by b.date desc)) as maxid
from gtpro a join
labresults b
on a.id = b.idgtpro
where (a.labSamples__yr = 2 and b.date >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)) or
(a.labSamples__yr = 4 and b.date >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)) or
(a.labSamples__yr = 12 and b.date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
group by a.labSamples__yr;
将
a.id
放入group by
不会给您最大的ID。