从表中返回下一个即将到来的日期匹配?

时间:2018-04-08 11:47:42

标签: mysql sql

我正在使用mysql ver开发一个篮子应用程序。 5.6 .. 在每个团队的日历上,我想知道如果游戏是下一个即将到来的游戏,返回1或0值。

我尝试过这个查询,但如果当天有游戏,则不予考虑;另外,如果有游戏,例如下个月,也不考虑(我知道是因为我按周设置了一个间隔):

select home, away, 
(case when (score_home = 0 and score_away = 0) 
and (match_date between now() and date_add(now(), interval 7 day))
then 1 else 0 end) as is_next

from calendario

order by year(match_date) asc, month(match_date) asc, day(match_date) asc

EDITED 示例数据

请看一下这个样本数据。为什么所有列都是0?

enter image description here

我尝试了这段代码:

SELECT C.ID, C.DATA, C.IDCAMPIONATO, (C.DATA >= CURDATE() AND NOT EXISTS (SELECT 1 FROM CALENDARIO C2 WHERE C2.DATA >= CURDATE() AND C2.DATA < C.DATA)) AS IS_NEXT
FROM CALENDARIO C
WHERE C.IDCAMPIONATO = 5
ORDER BY DATE(C.DATA) ASC

3 个答案:

答案 0 :(得分:2)

这是因为过滤。 now()包含时间组件。您需要curdate()来检查是否有其他游戏匹配。以下内容将标记calendario中的下一个游戏,这似乎是您要求的:

select c.*, 
       (c.match_date >= curdate() and
        not exists (select 1
                    from calendario c2
                    where c2.match_date >= curdate() and
                          c2.match_date < c.match_date
                   )
       ) as is_next
from calendario c
order by date(c.match_date) asc;

我对这个问题有几点不明白:

  • 为什么你在条件中包括分数?
  • 如果你想要每个团队,你为什么不过滤团队呢?
  • 这是什么意思? “在每个团队的日历上,......”

您可能想要提出另一个问题,将问题数据作为问题中的文字,以及更好地描述您的数据以及您真正想要做的事情。

答案 1 :(得分:1)

我在您的示例数据中注意到您有一个列ID。这个专栏是Auto-Inc吗?如果是,你可以使用它的潜力:

SELECT C.ID, C.DATA, C.IDCAMPIONATO,
(CASE WHEN CAL.ID = (SELECT C2.ID FROM CALENDARIO C2 WHERE C2.DATA >= CURDATE() AND C2.IDCAMPIONATO = IDCA ORDER BY C2.DATA LIMIT 1) THEN 1 ELSE 0 END) AS IS_NEXT,
FROM CALENDARIO C
WHERE C.IDCAMPIONATO = 5
ORDER BY DATE(C.DATA) ASC

我认为您使用“IDCAMPIONATO”列来识别团队,对吗?

希望得到这个帮助。

答案 2 :(得分:0)

您可以添加检查今天是否匹配,然后按日期排序,您可以限制1条记录以获得下一场比赛。

 select home, away, '1' as  is_next
from games where matchdate > now()
order by matchdate asc limit 1;  

http://sqlfiddle.com/#!9/88ba84/2