2010-01-19 56 views
0

我有两张桌子,一张有peopleID和名字的人的桌子,以及一张他们已经做出的有pledgeID(1到6)个人ID来表示它来自哪里的人的一张认捐表,以及数量字段。有多个匹配项的条件

我们需要有一个查询,给人们一个独特的名单,他们有多少总承诺和服务承诺的数量他们有正确的(pledgeIDs 1,3和5将被视为正确的)

所以我们需要知道,例如约翰史密斯总共承诺500英镑,他匹配了2个承诺(因为他已经承诺例如1,3和6),而莎莉詹姆斯已承诺2000英镑,并承诺ID 1,3和5,因此匹配3

我希望这是明确的。我真的很感谢这个帮助。

非常感谢

戴夫

+0

我会为认捐添加一个新表,因此您可以标记哪些是正确与否。这样你就没有这些神秘数字1,3和5出现在你的代码中。 – 2010-01-19 13:39:00

回答

2

听起来像这样的工作:

SELECT PersonID, 
    SUM(Amount) AS TotalPledged, 
    SUM(CASE WHEN PledgeID IN (1,3,5) THEN 1 ELSE 0 END) AS CorrectPledges 
FROM PersonPledges 
GROUP BY PersonID 
+0

谢谢你。这几乎可行,但可能有人有多个祈愿1条目(例如),然后计数太高。如果有1,3或5的承诺,它应该只计算一次。这可能吗? – Dave 2010-01-19 14:10:00

+0

你可能不得不使用SubQuery来获取它;因此,您的子查询将“选择不同的PersonID,PledgeID ...”,然后使用它来选择实际结果(如上所述)。 – 2010-01-19 18:27:23

-1

最简单的方法是:

1-获取所有从你的人的人表,例如类似这样的东西:

SELECT peopleId, name FROM people 

2-遍历每一行并获得每个人的承诺。在PHP中,你会做这样的事情:

foreach ($people as $k=>$person) 
{ 
    $sql = "SELECT SUM(amount) as total FROM pledges 
      WHERE peopleId = '$person[peopleId]'"; 
    $result = mysql_query($sql); 
    if (mysql_num_rows($result) <= 0) 
    $total = '0'; 
    else 
    { 
    $row = mysql_fetch_assoc($result); 
    $total = $row['total']; 
    } 
    $people[$k]['total'] = $total; 
} 
+0

我不会推荐这样做。通过循环记录来获得总数通常会变得很慢(例如,在这种情况下,由于需要进行数据库调用的次数); SQL几乎总能让你在一个直接查询中做同样的事情,这应该会更好。 – 2010-01-19 14:17:18

0

如果使用祈愿主表,你可以得到所有的信息出一个这样的:

SELECT People.PersonName, pledgetotals.PledgeTotal, pledgecounts.PledgesCorrect FROM People 
    LEFT OUTER JOIN (SELECT PeoplePledges.peopleID, SUM(PeoplePledges.pledgeAmount) AS PledgeTotal FROM PeoplePledges GROUP BY PeoplePledges.peopleID) pledgetotals ON People.peopleID = pledgetotals.peopleID 
    LEFT OUTER JOIN (SELECT PeoplePledges.peopleID, COUNT(DISTINCT PeoplePledges.pledgeID) AS PledgesCorrect FROM PeoplePledges JOIN Pledge ON PeoplePledges.pledgeID = Pledge.pledgeID WHERE Pledge.correct = 1 GROUP BY PeoplePledges.peopleID) pledgecounts ON People.peopleID = pledgecounts.peopleID 

希望不是太不清楚;每个子查询需要进行聚合(分别总结质押数量和计数正确质量);如果您用这种方式安排查询,则可以列出所有涉及的人员是否实际获得了任何承诺。

编辑:这就是我的意思是承诺的“主表”:

CREATE TABLE Pledge (INT pledgeID INT PRIMARY KEY, correct BOOLEAN NOT NULL); 
INSERT INTO Pledge (pledgeID, correct) VALUES (1, 1); 
INSERT INTO Pledge (pledgeID, correct) VALUES (2, 0); 
INSERT INTO Pledge (pledgeID, correct) VALUES (3, 1); 
INSERT INTO Pledge (pledgeID, correct) VALUES (4, 0); 
INSERT INTO Pledge (pledgeID, correct) VALUES (5, 1); 
INSERT INTO Pledge (pledgeID, correct) VALUES (6, 0); 

编辑:如果您不能添加承诺的主表,那么你就必须使用在你的代码中的'幻数',但结构是非常相似的:

SELECT People.PersonName, pledgetotals.PledgeTotal, pledgecounts.PledgesCorrect FROM People 
    JOIN (SELECT PeoplePledges.peopleID, SUM(PeoplePledges.pledgeAmount) AS PledgeTotal FROM PeoplePledges GROUP BY PeoplePledges.peopleID) pledgetotals ON People.peopleID = pledgetotals.peopleID 
    JOIN (SELECT PeoplePledges.peopleID, COUNT(DISTINCT PeoplePledges.pledgeID) AS PledgesCorrect FROM PeoplePledges WHERE PeoplePledges.pledgeID IN (1,3,5) GROUP BY PeoplePledges.peopleID) pledgecounts ON People.peopleID = pledgecounts.peopleID 
+0

谢谢你。我不知道PLEDGE引用了哪个表。你能澄清吗?谢谢 – Dave 2010-01-19 15:57:23

+0

啊,我明白了!我遇到的问题是我无法将表添加到数据库,我只能写查询。没有这个额外的桌子,这可以做到吗?感谢您的时间。 – Dave 2010-01-19 20:40:56

+0

完美的作品,非常感谢您的更新。 – Dave 2010-01-21 11:23:04

相关问题