如何加入两个比较不同结果的查询?

时间:2019-03-14 09:59:05

标签: mysql sql

我有一个名为match的表,其中包含足球比赛的所有matches。该表的结构如下:

id | round_id | datetime | status | home | away | result

基本上每个match都有一个status指示:

  1. 预定
  2. 推迟
  3. 取消
  4. 完成

还有round_id表示对competition的引用。

在我的应用程序中,我每次都检查是否需要更新特定的round。为此,我首先检查联盟的所有matches的状态是否为35。查询如下:

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,具体是(预定的然后推迟)。

由于以下原因,我对自己的实现并不满意:

  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已安排,但只有matchid已播放过4个,因此查询需要返回false,因为round 11尚未更新。

1 个答案:

答案 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。无论如何,您都可以将所有这些条件组合为单个布尔结果。