2014-11-09 69 views
0

我想從使用連接的不同表中選擇一些數據。加入SQL選擇正在返回雙重結果

首先,這裏是我的SQL(MS)查詢:

SELECT Polls.pollID, 
     Members.membername, 
     Polls.polltitle, (SELECT COUNT(*) FROM PollChoices WHERE pollID=Polls.pollID) AS 'choices', 
     (SELECT COUNT(*) FROM PollVotes WHERE PollVotes.pollChoiceID = PollChoices.pollChoicesID) AS 'votes' 
FROM Polls 
INNER JOIN Members 
ON Polls.memberID = Members.memberID 
INNER JOIN PollChoices 
ON PollChoices.pollID = Polls.pollID; 

以及參與此查詢的表是在這裏: tables

查詢返回這樣的結果:

pollID | membername | polltitle | choices | votes 
---------+------------+-----------+---------+------- 
10000036 | TestName | Test Title| 2  | 0 
10000036 | TestName | Test Title| 2  | 1 

任何幫助將不勝感激。

+0

您有什麼問題?您顯示數據定義,但不顯示任何輸入數據。如果我們不知道輸入是什麼,我們不知道應該顯示什麼輸出。如果我們假設有多個輸入記錄,則看起來輸出是正確的。 – user2338816 2014-11-09 02:01:30

+0

您是否可以包含特定於pollID = 10000036 – HaveNoDisplayName 2014-11-09 02:05:58

回答

2

您的INNER JOIN加入PollChoices將爲給定poll帶來超過1行,因爲投票10000036有2個選項,如choices列所示。

您可以更改查詢使用GROUP BY並獲得計數。

如果你沒有在PollVotesPolls表中每個成員的條目,你需要使用LEFT JOIN

SELECT Polls.pollID, 
     Members.membername, 
     Polls.polltitle, 
     COUNT(PollChoices.pollID) as 'choices', 
     COUNT(PollVotes.pollvoteId) as 'votes' 
FROM Polls 
INNER JOIN Members 
ON Polls.memberID = Members.memberID 
INNER JOIN PollChoices 
ON PollChoices.pollID = Polls.pollID 
INNER JOIN PollVotes 
ON PollVotes.pollChoiceID = PollChoices.pollChoicesID 
AND PollVotes.memberID = Members.memberID 
GROUP BY Polls.pollID, 
     Members.membername, 
     Polls.polltitle 
+0

的輸入記錄非常感謝您的簡單易懂的解釋和解決方案:) +1和接受 – Langkiller 2014-11-09 10:47:18

0

由於每個投票INNER JOIN成員都有多個選項,因此您爲每個PollChoices記錄獲得1行。您可能期望SELECT COUNT(*)子查詢充當GROUP BY子句,但它們不會。

如果沒有意義,請添加最少的樣本數據和預期結果,我們可以提供更多幫助。

0

這個查詢結果是告訴你票的數量每選擇在每個輪詢。

在你的例子中,這個名爲TestName的選民回答了投票(ID爲10000036),並給了一個選擇1票,第二個選擇0票。這就是爲什麼你在結果中得到兩行。

我不確定您是否期待只有一行,因爲您沒有指定要嘗試選擇的數據。然而,如果你想看到測試名提交,每一個選擇,其中得票率爲大於1的票數,那麼你將不得不修改您的查詢是這樣的:

select * from 
(SELECT Polls.pollID, 
      Members.membername, 
      Polls.polltitle, (SELECT COUNT(*) FROM PollChoices WHERE pollID=Polls.pollID) AS 'choices', 
      (SELECT COUNT(*) FROM PollVotes WHERE PollVotes.pollChoiceID = PollChoices.pollChoicesID) AS 'votes' 
    FROM Polls 
    INNER JOIN Members 
    ON Polls.memberID = Members.memberID 
    INNER JOIN PollChoices 
    ON PollChoices.pollID = Polls.pollID) as mysubquery where votes <> 0;