2010-01-19 3 views
0

2 개의 테이블, peopleID 및 이름을 가진 사람 테이블과 그들이 작성한 약속 서가 pledgeID (1 - 6) personID로 출생자를 나타냅니다. 금액 필드.일치 횟수가 여러 개인 기준

우리는 그들이 총 약속 얼마나 많은 사람들의 별개의 목록을 제공하는 쿼리가 필요하고, 약속의 수는 정확 (pledgeIDs 1,3 및 5 올바른 것으로 간주 될 것입니다) 가지고

예를 들어 존 스미스가 총 500 파운드를 기약했음을 알 필요가 있습니다. 그는 (예를 들어 1,3,6에 서약했기 때문에) 2 개의 서약을했고 샐리 제임스는 2000 파운드를 제공하겠다고 맹세했습니다 ids 1,3,5와 일치하므로 일치 3

희망이 있습니다. 나는 이것에 약간 도움을 진짜로 평가할 것입니다.

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

Pledges에 대한 새 테이블을 추가하여 올바른 테이블을 표시 할 수 있습니다. 그런 식으로이 미스테리 숫자 1, 3 및 5가 코드에서 자르지 않게됩니다. –

답변

2

작동 것 같은 것을 같은 소리

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

감사합니다. 이것은 거의 작동하지만 누군가가 pledge1 (예를 들어)에 대해 여러 항목을 가지고 있고 그 다음에 카운트가 너무 높은 경우가있을 수 있습니다. 1,3 또는 5의 서약이 있으면 한 번만 계산해야합니다. 가능합니까? – Dave

+0

아마도 하위 쿼리를 사용해야 할 것입니다. 따라서 하위 쿼리는 "DISTINCT PersonID, PledgeID ..."를 선택하고 그 결과를 사용하여 위와 같이 결과를 선택합니다. –

-1

가장 쉬운 방법으로 다음과 같습니다 :

많은 감사

데이브

+0

나는 이런 식으로하는 것을 권장하지 않는다. 레코드를 루핑하여 총계를 얻는 것은 종종 느리게 끝납니다 (예 :이 경우 필요한 데이터베이스 호출 수가 많아짐). SQL은 거의 언제나 똑같은 일을 한꺼번에 수행 할 수있게 해줍니다. –

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

THanks for this. 나는 PLEDGE가 어떤 테이블을 참조하는지 알지 못합니다. 명확히 해 주시겠습니까? 감사합니다 – Dave

+0

아하이 봐요! 내가 가진 문제는 데이터베이스에 테이블을 추가 할 수 없다는 것입니다. 쿼리 만 작성할 수 있습니다. 여분의 테이블없이이 작업을 수행 할 수 있습니까? 이것에 시간을내어 주셔서 감사합니다. – Dave

+0

완벽하게 작동합니다. 업데이트 해 주셔서 감사드립니다. – Dave