我有一些这样设置的表:

past_elections

election_ID bigint(15) unsigned;
Date date;
Race varchar(32)


candidates

Candidate_ID bigint(15) unsigned;
FirstName varchar(60);
LastName varchar(60)


past_elections-candidates

PastElection bigint(15);
Candidate bigint(15);
Votes int(8) unsigned


past_elections-candidates是一个中间表,该表将候选人表中Candidate_ID的主键与past_elections表中的lection_ID链接起来,因此我进行了设置,因为从技术上讲,候选人可以在候选人表中并可以运行多个参加同一选举(考虑部分任期限制或他们也想保留下一个任期的特别选举)或在另一年竞选连任。这就是为什么我建立了一对多的关系。

我的问题是,如何在数据库中查询所有种族的获胜者?怎样查询哪些人以不到总选票的X百分比赢得选举?我知道我可能必须使用MAX()之类的聚合函数以及INNER JOINGROUP BY,但这似乎很复杂。我希望有人以前做过相同或相似的事情。尽管可能会告诉我我以这种查询可能的最无效率的方式来建立表。 (交叉手指。)

最佳答案

要获得任何赛事的获胜者,您需要找到每次选举的最高票数,然后将其重新加入past_elections-candidates表以找到候选人编号,然后加入候选人表以获取详细信息:

SELECT pe.election_ID as elec,
       c.FirstName,
       c.LastName,
       pecs.max_votes AS votes,
       pecs.max_votes / pecs.total_votes AS percent
FROM past_elections pe
JOIN `past_elections-candidates` pec ON pec.PastElection = pe.election_ID
JOIN (SELECT PastElection,
             MAX(Votes) AS max_votes,
             SUM(Votes) AS total_votes
      FROM `past_elections-candidates`
      GROUP BY PastElection) pecs ON pecs.PastElection = pec.PastElection AND pecs.max_votes = pec.votes
JOIN candidates c ON c.Candidate_ID = pec.Candidate


输出:

elec    FirstName   LastName    votes   percent
1       Aladdin     Arabia      200     0.5714
2       Robin       Hood        150     0.4286


Demo on dbfiddle

关于mysql - 在SQL数据库上进行复杂查询以赢得选举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58600666/

10-12 05:03