[英]SQL query to count number of times certain values occur in multiple rows
假設我有一張選舉數據表,稱為“選舉”,每次選舉每個選民都有一行,如下所示:
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)
),則該選民可能有兩(2)行用於ElectionID 1,而對於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
我認為這應該可行,但我不是很肯定...(不記得是否可以在這樣的COUNT
中使用COUNT
)。 讓我知道?
SELECT COUNT(*)
FROM ELECTIONS e1, ELECTIONS e2
WHERE e1.VoterID = e2.VoterID
AND e1.ElectionID = 1
AND e2.ElectionID = 2;
我會建議更像這樣的東西:
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個子查詢。
SELECT COUNT(*)
FROM
( SELECT voterid
FROM votes
WHERE electionid IN(1,2)
GROUP
BY voterid
HAVING COUNT(*) = 2
) x;
假設您在(voterid,electionid)上形成了UNIQUE或PRIMARY KEY
這很簡單,如下所示
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
結果集的大小將提供符合您的條件的選民數量(即沒有理由匯總更多的選民(即像子選擇一樣)以獲取該數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.