2011-04-09 32 views
0

选择我有两个表中的字段的巫帮[仅需提到]MySQL的两个表

- partners 
    - id [PRI, int] 
    - name [varchar(20)] 
    - match [=matches.id] 
    - can_call [int] 


- players 
    - registered [0/1] 
    - partner [=partners.id] 
    - match [=matches.id] 

现在,我需要一个查询,这将使一个int - 有多少球员能的合作伙伴之一调用;

要获得多少玩家所要求的任何比赛的任何搭档,我使用:

SELECT COUNT(id) 
FROM players 
WHERE registered=1 
    AND partner=PARTNER_ID 
    AND match=MATCH_ID 

现在,我需要有这样的事情:

SELECT (can_call-THE_ABOVE) as free 
FROM partners 
WHERE match=MATCH_ID 

而且我不知道如何做到这一点:)

的理念是:获得免费的位置,因为我们想为我们想要的比赛的合作伙伴,然后选择。减去COUNT(ID)的球员,已经被注册了那场比赛由合作伙伴。

谢谢! [我希望我有道理^ _ ^]

编辑:我已经解决了(在两个加入答案之前)。我可能会用我的解决方案,因为它更简单;但我会看起来更到其他的答案,一旦我会想成为MySQL的用户advnaced,谢谢大家^^

+0

为什么不使用加入? – 2011-04-09 19:22:31

+0

什么是你的“总”从......它是一个固定的“最大团队规模”的东西? – DRapp 2011-04-09 19:22:57

+0

@Ashwini:因为真正的初学者在MySQL方面,所以加入,使尽可能多的意义,因为我虽然我会用。 @DRapp - 我的错误,totall实际上是'can_call',将在代码中取代它。 – 2011-04-09 19:24:45

回答

1

没关系,理解了它;它是完全按照我上面的伪代码:

SELECT can_call - (SELECT COUNT(id) FROM players WHERE ...) as free 
    WHERE match=MATCH_ID AND id=PARTNER_ID 

^^

2
Select P.name 
    , P.can_call - Coalesce(Calls.CallCount,0) As CanCall 
From partners As P 
    Left Join (
       Select partner, match, Count(*) As CallCount 
       From players As P1 
       Where registered = 1 
       Group By partner, match, 
       ) As Calls 
     On Calls.partner = P.id 
      And Calls.match = P.match 
Where P.match = MATCH_ID 
+0

这看起来真的铁杆......我可能会使用它作为答复我为什么不考虑'JOIN' ...谢谢你,但! :) – 2011-04-09 19:26:43

+0

我想你应该intercgange两个'FROM ...'条款 – 2011-04-09 19:45:47

+0

@yypercube - 是的。这是我的心理错位。 – Thomas 2011-04-09 19:50:47

1
SELECT pa.can_call-COUNT(pl.id) 
     AS free 
FROM partners pa 
    LEFT JOIN players pl 
    ON pl.registered=1 
     AND pl.partner=pa.id 
     AND pl.match=pa.match 
WHERE pa.id=PARTNER_ID 
    AND pa.match=MATCH_ID 
GROUP BY pa.id 
     , pa.match 
+0

我认为可以放弃GROUP BY。 – 2011-04-09 19:40:31

+0

@亚当:当你开始考虑JOIN时,你可以用它作为借口。 – 2011-04-09 19:48:24