假设我有一个选举数据表,称之为选举,每次选举每个选民一行,如下:
VoterID ElectionID
A 1
A 2
B 1
C 2
D 3
E 1
E 2
我想知道在选举1和选举2中投票的选民人数;我不关心别人。号码应为2(选民A和选民E)。
这样的事情会起作用吗?
select count(Elections) as NumVoters
from (
select VoterID, ElectionID, count(ElectionID) as Elections
from ELECTIONS
where ElectionID=1 or ElectionID=2
group by VoterID
having (count(ElectionID)=2)
) x;
更新:这是我在这里提出的第一个问题,我很惊讶于人们的帮助和快速。我修改了上面的查询以修复最后缺少别名并添加终止分号。
谢谢!
答案 0 :(得分:2)
是。你有什么应该工作。 (您需要在派生表上添加别名,您获得的错误消息应该是自我解释的。易于修复,只需在查询结尾处添加空格和字母c(或任何您想要的名称)。 / p>
关于重复(VoterID, ElectionID)
元组的可能性,有一点需要注意。
如果您对(VoterID,ElectionID)有唯一约束,那么您的查询将正常工作。
如果您没有唯一约束(不允许重复(VoterID, ElectionId)
),那么ElectionID 1可能有两(2)行的选民,而ElectionID 2没有行......那个选民被列入伯爵。并且选民在ElectionID 1中投票两次,在ElectionID 2中只投票一次,该选民将被排除在计票之外。
在COUNT中包含DISTINCT关键字可以解决这个问题,例如
HAVING COUNT(DISTINCT ElectionID) = 2
我会以不同的方式编写查询,但您所拥有的将会有效。
为了获得参与ElectionID 1和ElectionID2的VoterID计数,为了提高性能,我避免使用内联视图(MySQL将其称为派生表)。我有查询使用JOIN操作。像这样:
SELECT COUNT(DISTINCT e1.voterID) AS NumVoters
FROM elections e1
JOIN elections e2
ON e2.voterID = e1.voterID
WHERE e1.electionID = 1
AND e2.electionID = 2
如果保证(voterID, ElectionID)
是唯一的,那么选择可能更简单:
SELECT COUNT(1) AS NumVoters
FROM elections e1
JOIN elections e2
ON e2.voterID = e1.voterID
WHERE e1.electionID = 1
AND e2.electionID = 2
答案 1 :(得分:0)
我认为这应该有用,但我不是肯定的......(不记得COUNT
是否可以在这样的连接中使用)。让我知道吗?
SELECT COUNT(*)
FROM ELECTIONS e1, ELECTIONS e2
WHERE e1.VoterID = e2.VoterID
AND e1.ElectionID = 1
AND e2.ElectionID = 2;
答案 2 :(得分:0)
我会推荐更像这样的东西:
SELECT COUNT(*) AS NumVoters
FROM ELECTIONS e1
WHERE e1.ElectionID = 1
AND e1.VoterID in (
SELECT e2.VoterID
FROM ELECTIONS e2
WHERE e2.ElectionID = 2
);
这样你解决了问题,并且只有1个子查询。
答案 3 :(得分:0)
SELECT COUNT(*)
FROM
( SELECT voterid
FROM votes
WHERE electionid IN(1,2)
GROUP
BY voterid
HAVING COUNT(*) = 2
) x;
这假设您在(voterid,electid)上形成了UNIQUE或PRIMARY KEY
答案 4 :(得分:0)
这很简单,如下所示
SELECT voterid, COUNT(DISTINCT electionid) AS electioncount
FROM table
WHERE electionid IN (1, 2) /* substitute elections you are interested in here */
GROUP BY voterid
HAVING electioncount = 2 /* substiture number of election listed in where condition above
结果集大小将提供符合您标准的选民数量(即没有理由进行聚合(即与子选择一样)以获得该数据。