带连接的SQL select返回双重结果

时间:2014-11-09 01:42:35

标签: sql inner-join redundancy

我正在尝试使用join从不同的表中选择一些数据。

首先,这是我的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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

您与PollChoices的INNER JOIN为给定的poll带来了超过1行,因为choices列所示的民意调查10000036有2个选项。

您可以更改查询以使用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

答案 1 :(得分:0)

每个民意调查记录都会获得1行,因为每个民意调查INNER JOIN会员有多个选择。您可能希望SELECT COUNT(*)子查询充当GROUP BY子句,但它们不会。

如果没有意义,请添加最少的样本数据和预期结果,我们可以提供更多帮助。

答案 2 :(得分:0)

此查询结果会告诉您每次投票中每次选择的投票数。

在你的例子中,这个名为TestName的选民回答了民意调查(ID为10000036)并给出了一个选择1票,第二个选择0票。这就是你在结果中得到两行的原因。

我不确定您是否只期待一行,因为您没有指定您要选择的确切数据。但是,如果您要查看TestName已提交的投票数,则对于投票大于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;