首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何连接两个比较不同结果的查询?

如何连接两个比较不同结果的查询?
EN

Stack Overflow用户
提问于 2019-03-14 17:59:05
回答 1查看 62关注 0票数 1

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

代码语言:javascript
复制
id | round_id | datetime | status | home | away | result

实际上,每个match都有一个status,表示:

  1. Scheduled
  2. Postponed
  3. Canceled
  4. Playing
  5. Finished

还有指示competition引用的round_id

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

代码语言:javascript
复制
SELECT (COUNT(*) = SUM(status in (3, 5)) 
                   AND COUNT(*) = 380) AS result 
                   FROM `match` WHERE round_id = 10

因此,如果380匹配被取消或完成,则更新round 10。

如果上面查询的结果为假,因此需要更新轮次,那么我必须检查需要更新哪个matches

为此,我编写了以下查询:

代码语言:javascript
复制
SELECT COUNT(*) AS result FROM `match` m2 
                   WHERE m2.round_id = 10
                   AND m2.datetime < NOW() AND m2.status IN (1, 2)

上面的查询检查是否存在datetime低于当前的matches,以及它们的状态是1还是2,具体地说(scheduled和postponed)。

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

  1. 如果我需要更新,我需要执行两个查询来检查。
  2. 最后一个查询返回match的编号,但我的目标是返回一个boolean。不幸的是,我的sql技能还不够高级。

是否可以将这两个查询合并为一个简单的检查?

提前感谢你的帮助。

UPDATE -具有数据结构的数据库

代码语言:javascript
复制
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。

现在考虑这个例子:

代码语言:javascript
复制
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,但只有id为4的match已经播放,因此查询需要返回false,因为round 11没有更新。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-14 18:59:22

我认为你想要这样的东西:

代码语言:javascript
复制
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。在任何情况下,您都可以将所有这些条件组合成一个布尔结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55159557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档