2014-11-09 29 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;