【问题标题】:SQL select with join are returning double results带有连接的 SQL 选择返回双重结果
【发布时间】:2014-11-09 01:42:35
【问题描述】:

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

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

这个查询中涉及的表在这里:

查询返回这个结果:

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

任何帮助将不胜感激。

【问题讨论】:

  • 你有什么问题?您显示数据定义,但不显示任何输入数据。如果我们不知道输入是什么,我们就不知道应该显示什么输出。如果我们假设有多个输入记录,看起来输出是正确的。
  • 能否包含特定于 pollID = 10000036 的输入记录

标签: sql inner-join redundancy


【解决方案1】:

您与 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 并接受
【解决方案2】:

每个 PollChoices 记录都有 1 行,因为每个 Polls INNER JOIN 成员有多个选择。您可能希望 SELECT COUNT(*) 子查询充当 GROUP BY 子句,但事实并非如此。

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

【讨论】:

    【解决方案3】:

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

    在您的示例中,这个名为 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;
    

    【讨论】:

      猜你喜欢
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      相关资源
      最近更新 更多