2010-01-19 55 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

相關問題