我有一个名为match
的表,其中包含足球比赛的所有matches
。该表的结构如下:
id | round_id | datetime | status | home | away | result
基本上每个match
都有一个status
指示:
还有round_id
表示对competition
的引用。
在我的应用程序中,我每次都检查是否需要更新特定的round
。为此,我首先检查联盟的所有matches
的状态是否为3
或5
。查询如下:
SELECT (COUNT(*) = SUM(status in (3, 5))
AND COUNT(*) = 380) AS result
FROM `match` WHERE round_id = 10
因此,如果380
比赛被取消或结束,那么round
10将被更新。
如果上面查询的结果为false,则需要更新该回合,那么我必须检查哪些matches
需要更新。
为此,我编写了以下查询:
SELECT COUNT(*) AS result FROM `match` m2
WHERE m2.round_id = 10
AND m2.datetime < NOW() AND m2.status IN (1, 2)
上面的查询检查是否有matches
比当前的datetime
低,并且它们的状态是1
还是2
,具体是(预定的然后推迟)。
由于以下原因,我对自己的实现并不满意:
match
的编号,但我的目标是返回boolean
。不幸的是,我的sql
的技能还不够先进。是否可以将这两个查询合而为一来简单地进行检查?
预先感谢您的帮助。
更新-具有数据结构的数据库:
id | round_id | datetime | status | home | away | result
1 10 2018-08-15 00:00:00 5 A B 1-0
2 10 2018-08-15 00:00:00 5 C D 1-1
3 10 2018-08-15 00:00:00 5 E F 2-1
4 10 2018-08-15 00:00:00 5 G H 2-2
上面的matches
都已更新,因为状态为5
,所以round
10不需要任何更新。第一个查询将返回true
,第二个查询将返回0。
现在考虑以下示例:
id | round_id | datetime | status | home | away | result
1 11 2018-08-15 00:00:00 5 A B 1-0
2 11 2019-08-15 00:00:00 1 C D
3 11 2019-01-15 00:00:00 5 E F 2-1
4 11 2019-03-12 00:00:00 1 G H
round
11需要更新,因为我们有2个matches
已安排,但只有match
和id
已播放过4个,因此查询需要返回false
,因为round
11尚未更新。
答案 0 :(得分:1)
我认为您想要这样的东西:
SELECT (COUNT(*) = SUM(status in (3, 5)) AND
COUNT(*) = 380 AND
SUM(mdatetime < NOW() AND status IN (1, 2)) = 0
) AS result
FROM `match`
WHERE round_id = 10;
我认为您只想检查第二个查询是否返回的计数大于0。无论如何,您都可以将所有这些条件组合为单个布尔结果。