3

我有一个(示例)应用程序向用户发送棒球比分。用户可以选择应该为某些特定球队发送哪一局的比分(例如,'在 7 局后向我发送洋基队的比分)。还有一个用于“所有其他”球队的设置(例如,“在 8 局后将任何其他球队的得分发送给我)。

这些设置被保存到存储用户、球队 ID 和局数的表格中。团队 ID“99”用于“所有其他团队”。所以我们用户的记录看起来像:

**User - Team - Innings**

Bob - 13 (Yankees) - 7

Bob - 99 (all other teams) - 8

现在是时候检查分数并发送一些通知了。我发现洋基队的比赛已经到了第 7 局的尾声,并向 Bob 发送了一条消息。

20 分钟后,同一场洋基队的比赛已经打到第 8 局。Bob 这次不应该收到消息,因为他在 7 局后收到了消息。

现在考虑朱莉:

**User - Team - Innings**

Julie - 13 (Yankees) - 8

Julie - 99 (all other teams) - 7

Julie 使用设置说“将 7 局后的所有得分发送给我,除了洋基队的得分应该等到 8 局”。这一次,在洋基队比赛的 7 局之后,朱莉应该不会收到通知。

最后,德克。德克有些疑惑:

**User - Team - Innings**

Dirk - 13 (Yankees) - 7

Dirk - 99 (all other teams) - 7

他的洋基队设置是相当多余的,但无论如何——只要他没有两次收到相同的通知,他就没事。


洋基队的比赛刚刚打完第7局。查询我的表并决定谁需要获取警报的最佳方式是什么?

我对 SQL 相当陌生,但我认为我可以进行简单的语言表示:

发送警报至:

任何在 X 局后关心 A 队的人,除非他们在 < X 局后也关心所有球队(他们已经收到警报)

任何在 X 局后关心所有球队的人,除非他们在 < X 局后也关心 A 队(他们已经收到警报)

(我不认为这实际上涵盖了德克的场景?)

我最好的猜测是,我需要创建一个匹配球队和局数的 WHERE 子句,然后还要测试同一个表中是否有符合上述条件的同一用户的记录。

这超出了我的范围 - 我什至不知道谷歌有什么技术。我什至想不出一个像样的问题标题:/

4

1 回答 1

1

首先进行显示特定团队设置和一般团队设置的选择。您可以通过将表连接到自身来做到这一点。

select s.*, g.innings as g_innings 
from settings s join settings g 
on (g.user = s.user and g.team = 99) -- 'g.team is null' would be better, yes...

剩下的很简单:用适当的 where 子句使用这个 select 两次,然后合并结果。

编辑:使用单个查询和两个 where 子句。

select s.*, g.innings as g_innings 
from settings s join settings g 
on (g.user = s.user and g.team = 99) -- 'g.team is null' would be better, yes...
where (s.innings = X AND g.innings >= X) 
OR (g.innings = X AND s.innings >= x)
于 2013-09-26T14:50:08.960 回答