SQL查询计算多行中某些值出现的次数

时间:2014-01-20 19:56:17

标签: mysql sql

假设我有一个选举数据表,称之为选举,每次选举每个选民一行,如下:

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;

更新:这是我在这里提出的第一个问题,我很惊讶于人们的帮助和快速。我修改了上面的查询以修复最后缺少别名并添加终止分号。

谢谢!

5 个答案:

答案 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

结果集大小将提供符合您标准的选民数量(即没有理由进行聚合(即与子选择一样)以获得该数据。