假设我有一张选举数据表,称为选举,每个选举每个选民都有一行,如下所示:
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;
更新:这是我在这里的第一个问题,我被那些热心而又快速的人们所震撼。我修改了上面的查询,以解决最后缺少别名并添加终止分号的问题。
谢谢你!
是的。你所拥有的应该工作。(您将需要在派生表上添加一个别名,您得到的错误消息应该是不言自明的。易于修复,只需在查询末尾添加一个空格和字母c(或您想要的任何名称)即可。
关于重复(VoterID, ElectionID)元组的潜力,有一个警告。
(VoterID, ElectionID)
如果您对(VoterID,ElectionID)有唯一的约束,那么您的查询将正常工作。
如果您没有唯一的约束(不允许重复(VoterID, ElectionId)),则可能有一个选民有两(2)行用于ElectionID 1,而没有行用于ElectionID 2 …使该选票包含在计数中。在ElectionID 1中进行了两次投票而在ElectionID 2中仅进行了一次投票的选民,该选民将从计数中排除。
(VoterID, ElectionId)
在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)唯一,那么选择可能会更简单:
(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