我正在尝试使用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;
此查询涉及的表格如下:
查询返回此结果:
pollID | membername | polltitle | choices | votes
---------+------------+-----------+---------+-------
10000036 | TestName | Test Title| 2 | 0
10000036 | TestName | Test Title| 2 | 1
非常感谢任何帮助。
答案 0 :(得分:4)
您与PollChoices
的INNER JOIN为给定的poll
带来了超过1行,因为choices
列所示的民意调查10000036有2个选项。
您可以更改查询以使用GROUP BY
并获取计数。
如果您在PollVotes
或Polls
表中没有每个成员的条目,则需要使用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;